Paso 5- Trayectorias de hospitalización y mortalidad con foco en condiciones vinculadas a trastornos de salud mental y consumo de sustancias posterior a un primer ingreso por alguno de estos trastornos, en usuarios/as jóvenes y adultos emergentes de población general y pertenecientes a pueblos originarios, 2018-2021, Chile

Representar las mejores opciones de agrupamiento, junto con su relación con otras variables (para poster)

Author

Andrés González Santa Cruz

Published

October 2, 2024

Configurar

Code
# remover objetos y memoria utilizada
rm(list=ls());gc()
          used (Mb) gc trigger (Mb) max used (Mb)
Ncells  598995 32.0    1285497 68.7   841053 45.0
Vcells 1160262  8.9    8388608 64.0  1876493 14.4
Code
if(Sys.info()["sysname"]=="Windows"){
 folder_path <- ifelse(dir.exists("H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II/"),
                       "H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II/",
                       "C:/Users/CISS Fondecyt/Mi unidad/Alvacast/SISTRAT 2022 (github)/_proposal_grant/2023/")
} else {folder_path <- ""}
load(paste0(folder_path,"20240903.RData"))

Paquetes estadísticos

Code
#elegir repositorio
if(Sys.info()["sysname"]=="Windows"){
  options(repos = c(CRAN = "https://cran.dcc.uchile.cl/"))
}
options(install.packages.check.source = "yes") # Chequea la fuente de los paquetes

#borrar caché
#system("fc-cache -f -v")

if(!require(pacman)){install.packages("pacman");require(pacman)}

pacman::p_unlock(lib.loc = .libPaths()) #para no tener problemas reinstalando paquetes

if(Sys.info()["sysname"]=="Windows"){
if (getRversion() != "4.4.0") { stop("Requiere versión de R 4.4.0. Actual: ", getRversion()) }
}

if(!require(job)){install.packages("job");require(job)}
if(!require(kableExtra)){install.packages("kableExtra");require(kableExtra)}
if(!require(tidyverse)){install.packages("tidyverse");require(tidyverse)}
if(!require(cluster)){install.packages("cluster"); require(cluster)}
if(!require(WeightedCluster)){install.packages("WeightedCluster"); require(WeightedCluster)}
if(!require(devtools)){install.packages("devtools"); require(devtools)}
if(!require(TraMineR)){install.packages("TraMineR"); require(TraMineR)}
if(!require(TraMineRextras)){install.packages("TraMineRextras"); require(TraMineRextras)}
if(!require(NbClust)){install.packages("NbClust"); require(NbClust)}
if(!require(haven)){install.packages("haven"); require(haven)}
if(!require(ggseqplot)){install.packages("ggseqplot"); require(ggseqplot)}
if(!require(gridExtra)){install.packages("gridExtra"); require(gridExtra)}
if(!require(Tmisc)){install.packages("Tmisc"); require(Tmisc)}
if(!require(factoextra)){install.packages("factoextra"); require(factoextra)}
if(!require(stargazer)){install.packages("stargazer"); require(stargazer)}
if(!require(gtsummary)){install.packages("gtsummary"); require(gtsummary)}
if(!require(lmtest)){install.packages("lmtest"); require(lmtest)}
if(!require(emmeans)){install.packages("emmeans"); require(emmeans)}
if(!require(fpp2)){install.packages("fpp2"); require(fpp2)}
if(!require(purrr)){install.packages("purrr"); require(purrr)}
if(!require(forecast)){install.packages("forecast"); require(forecast)}
if(!require(magrittr)){install.packages("magrittr"); require(magrittr)}
if(!require(foreach)){install.packages("foreach"); require(foreach)}
if(!require(doParallel)){install.packages("doParallel"); require(doParallel)}
if(!require(progressr)){install.packages("progressr"); require(progressr)}
if(!require(chisq.posthoc.test)){devtools::install_github("ebbertd/chisq.posthoc.test")}
if(!require(rstatix)){install.packages("rstatix"); require(rstatix)}


seq_mean_t_dos_grupos <- function(bd = NULL, group1, group2) {
  # Agrupar por ambas variables
  resultados <- by(bd, list(group1, group2), seqmeant)
  
  # Obtener todas las combinaciones posibles de los grupos
  combinaciones <- expand.grid(group1 = unique(group1), group2 = unique(group2), stringsAsFactors = FALSE)
  
  # Extraer los resultados y asociarlos con las combinaciones
  resultados_df <- do.call(rbind, lapply(seq_along(resultados), function(i) {
    group_name1 <- attr(resultados, "dimnames")[[1]][i]
    group_name2 <- attr(resultados, "dimnames")[[2]][i]
    
    data.frame(factor_inclusivo_1 = group_name1, 
               factor_inclusivo_2 = group_name2, 
               Mean = resultados[[i]])
  }))
  
  # Unir los resultados con las combinaciones para rellenar los valores faltantes
  final_df <- merge(combinaciones, resultados_df, by.x = c("group1", "group2"), 
                    by.y = c("factor_inclusivo_1", "factor_inclusivo_2"), all.x = TRUE)
  
  return(final_df)
}

multinom_pivot_wider <- function(x) {
  # check inputs match expectatations
  # create tibble of results
  df <- tibble::tibble(outcome_level = unique(x$table_body$groupname_col))
  df$tbl <- 
    purrr::map(
      df$outcome_level,
      function(lvl) {
        gtsummary::modify_table_body(
          x, 
          ~dplyr::filter(.x, .data$groupname_col %in% lvl) %>%
            dplyr::ungroup() %>%
            dplyr::select(-.data$groupname_col)
        )
      }
    )
  
  tbl_merge(df$tbl, tab_spanner = paste0("**", df$outcome_level, "**"))
}

best_subset_multinom <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  
  # Generar todas las combinaciones posibles de predictores
  predictors_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar los resultados
  results <- list()
  
  # Iterar sobre cada combinación de predictores
  for (i in seq_along(predictors_list)) {
    predictors <- predictors_list[[i]]
    formula <- as.formula(paste(y, "~", paste(predictors, collapse = "+")))
    
    # Ajustar el modelo multinomial
    model <- tryCatch(
      nnet::multinom(formula, data = data, trace = FALSE),
      error = function(e) NULL
    )
    
    # Si el modelo se ajustó correctamente, almacenar los resultados
    if (!is.null(model)) {
      # Extraer el AIC del modelo
      aic <- AIC(model)
      
      # Almacenar la información en una lista
      results[[length(results) + 1]] <- list(
        predictors = predictors,
        model = model,
        AIC = aic
      )
    }
  }
  
  # Convertir la lista de resultados en un dataframe
  results_df <- results %>%
    purrr::map_df(function(res) {
      data.frame(
        predictors = paste(res$predictors, collapse = "+"),
        AIC = res$AIC,
        stringsAsFactors = FALSE
      )
    })
  
  # Ordenar los modelos por AIC de menor a mayor
  results_df <- results_df %>% arrange(AIC)
  
  return(results_df)
}
best_subset_multinom_interactions <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  
  # Generar todas las combinaciones posibles de predictores (efectos principales)
  main_effects_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar los resultados
  results <- list()
  
  # Iterar sobre cada combinación de efectos principales
  for (main_effects in main_effects_list) {
    
    # Generar términos de interacción de hasta 3 variables
    interaction_terms <- list()
    
    # Para interacciones de 2 variables
    if (length(main_effects) >= 2) {
      interaction_terms_2way <- combn(main_effects, 2, function(x) paste(x, collapse = ":"))
      interaction_terms <- c(interaction_terms, interaction_terms_2way)
    }
    
    # Para interacciones de 3 variables
    if (length(main_effects) >= 3) {
      interaction_terms_3way <- combn(main_effects, 3, function(x) paste(x, collapse = ":"))
      interaction_terms <- c(interaction_terms, interaction_terms_3way)
    }
    
    # Combinar efectos principales e interacciones
    all_terms <- c(main_effects, interaction_terms)
    
    # Generar todas las combinaciones posibles de términos (incluyendo interacciones)
    # Solo se incluyen interacciones si sus efectos principales están presentes
    term_combinations <- list()
    
    # Obtener todos los subconjuntos de efectos principales
    main_effects_subsets <- lapply(1:length(main_effects), function(i) {
      combn(main_effects, i, simplify = FALSE)
    }) %>% unlist(recursive = FALSE)
    
    # Para cada subconjunto de efectos principales
    for (me in main_effects_subsets) {
      # Iniciar con los efectos principales
      terms <- me
      
      # Incluir interacciones solo si todos sus efectos principales están incluidos
      possible_interactions <- interaction_terms[
        sapply(interaction_terms, function(x) {
          vars_in_interaction <- unlist(strsplit(x, ":"))
          all(vars_in_interaction %in% me)
        })
      ]
      
      # Generar todas las combinaciones de interacciones para incluir
      interaction_subsets <- list(NULL)
      if (length(possible_interactions) > 0) {
        interaction_subsets <- lapply(1:length(possible_interactions), function(i) {
          combn(possible_interactions, i, simplify = FALSE)
        }) %>% unlist(recursive = FALSE)
      }
      
      # Para cada combinación de interacciones, crear el conjunto completo de términos
      for (ints in interaction_subsets) {
        if (is.null(ints)) {
          full_terms <- terms
        } else {
          full_terms <- c(terms, ints)
        }
        
        # Añadir a la lista de combinaciones de términos
        term_combinations <- append(term_combinations, list(full_terms))
      }
    }
    
    # Ajustar modelos para cada combinación de términos
    for (terms in term_combinations) {
      formula <- as.formula(paste(y, "~", paste(terms, collapse = "+")))
      
      # Ajustar el modelo multinomial
      model <- tryCatch(
        nnet::multinom(formula, data = data, trace = FALSE),
        error = function(e) NULL,
        warning = function(w) NULL
      )
      
      # Si el modelo se ajustó correctamente, almacenar los resultados
      if (!is.null(model)) {
        # Extraer el BIC del modelo
        bic <- BIC(model)
        
        # Almacenar la información en la lista de resultados
        results[[length(results) + 1]] <- list(
          predictors = paste(terms, collapse = " + "),
          model = model,
          BIC = bic
        )
      }
    }
  }
  
  # Convertir la lista de resultados en un dataframe
  results_df <- results %>%
    purrr::map_df(function(res) {
      data.frame(
        predictors = res$predictors,
        BIC = res$BIC,
        stringsAsFactors = FALSE
      )
    })
  
  # Ordenar los modelos por BIC de menor a mayor
  results_df <- results_df %>% arrange(BIC)
  
  return(results_df)
}

best_subset_multinom_interactions_parallel <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias dentro de la función
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  require(foreach)
  require(doParallel)
  require(progressr)
  
  # Iniciar los gestores de progreso
  handlers(global = TRUE)
  handlers("txt")
  
  # Generar todas las combinaciones posibles de predictores (efectos principales)
  main_effects_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar las fórmulas de los modelos
  formulas_list <- list()
  
  # Generar todas las fórmulas posibles con interacciones hasta de 3 variables
  for (main_effects in main_effects_list) {
    
    # Generar términos de interacción de hasta 3 variables
    interaction_terms <- character(0)  # Aseguramos que es un vector de caracteres
    
    # Para interacciones de 2 variables
    if (length(main_effects) >= 2) {
      interaction_terms_2way <- combn(main_effects, 2, function(x) paste(x, collapse = ":"), simplify = TRUE)
      interaction_terms <- c(interaction_terms, interaction_terms_2way)
    }
    
    # Para interacciones de 3 variables
    if (length(main_effects) >= 3) {
      interaction_terms_3way <- combn(main_effects, 3, function(x) paste(x, collapse = ":"), simplify = TRUE)
      interaction_terms <- c(interaction_terms, interaction_terms_3way)
    }
    
    # Generar todas las combinaciones posibles de efectos principales
    main_effects_subsets <- lapply(1:length(main_effects), function(i) {
      combn(main_effects, i, simplify = FALSE)
    }) %>% unlist(recursive = FALSE)
    
    # Para cada subconjunto de efectos principales
    for (me in main_effects_subsets) {
      # Iniciar con los efectos principales
      terms <- me
      
      # Identificar interacciones cuyos efectos principales están en 'me'
      if (length(interaction_terms) > 0) {
        possible_interactions <- interaction_terms[
          vapply(interaction_terms, function(x) {
            vars_in_interaction <- unlist(strsplit(x, ":"))
            all(vars_in_interaction %in% me)
          }, FUN.VALUE = logical(1))
        ]
      } else {
        possible_interactions <- character(0)
      }
      
      # Generar todas las combinaciones posibles de estas interacciones
      interaction_subsets <- list(character(0))  # Incluir el caso sin interacciones
      if (length(possible_interactions) > 0) {
        interaction_combinations <- lapply(1:length(possible_interactions), function(i) {
          combn(possible_interactions, i, simplify = FALSE)
        }) %>% unlist(recursive = FALSE)
        interaction_subsets <- c(interaction_subsets, interaction_combinations)
      }
      
      # Para cada combinación de interacciones
      for (ints in interaction_subsets) {
        full_terms <- c(terms, ints)
        
        # Crear la fórmula del modelo y almacenarla
        formula_str <- paste(y, "~", paste(full_terms, collapse = "+"))
        formulas_list <- append(formulas_list, list(formula_str))
      }
    }
  }
  
  # Eliminar posibles duplicados de fórmulas
  formulas_list <- unique(formulas_list)
  
  # Total de modelos a ajustar
  total_models <- length(formulas_list)
  
  # Iniciar el progreso
  p <- progressor(steps = total_models)
  
  # Ajustar los modelos en paralelo usando foreach
  results_list <- foreach(i = 1:total_models, .packages = c("nnet", "MASS"), .combine = 'rbind') %dopar% {
    formula_str <- formulas_list[[i]]
    formula <- as.formula(formula_str)
    
    # Ajustar el modelo
    model <- tryCatch(
      nnet::multinom(formula, data = data, trace = FALSE),
      error = function(e) NULL,
      warning = function(w) NULL
    )
    
    # Actualizar el progreso
    p(sprintf("Ajustando modelo %d de %d", i, total_models))
    
    # Si el modelo se ajustó correctamente, almacenar los resultados
    if (!is.null(model)) {
      bic <- BIC(model)
      data.frame(
        predictors = formula_str,
        BIC = bic,
        stringsAsFactors = FALSE
      )
    } else {
      NULL
    }
  }
  
  # Convertir los resultados a dataframe y ordenar por BIC
  results_df <- as.data.frame(results_list)
  results_df <- results_df %>% arrange(BIC)
  
  return(results_df)
}


num_cores <- parallel::detectCores() - 1
cl <- makeCluster(num_cores)
registerDoParallel(cl)

#pacman job kableExtra tidyverse cluster WeightedCluster devtools TraMineR TraMineRextras NbClust haven ggseqplot gridExtra Tmisc factoextra reticulate withr rmarkdown quarto

options(knitr.kable.NA = '')


#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#

knitr::knit_hooks$set(time_it = local({
  now <- NULL
  function(before, options) {
    if (before) {
      # record the current time before each chunk
      now <<- Sys.time()
    } else {
      # calculate the time difference after a chunk
      res <- ifelse(difftime(Sys.time(), now)>(60^2),difftime(Sys.time(), now)/(60^2),difftime(Sys.time(), now)/(60^1))
      # return a character string to show the time
      x<-ifelse(difftime(Sys.time(), now)>(60^2),paste("Tiempo que demora esta sección:", round(res,1), "horas"),paste("Tiempo que demora esta sección:", round(res,1), "minutos"))
      paste('<div class="message">', gsub('##', '\n', x),'</div>', sep = '\n')
    }
  }
}))
knitr::opts_chunk$set(time_it = TRUE)

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:

format_cells <- function(df, rows ,cols, value = c("italics", "bold", "strikethrough")){
  
  # select the correct markup
  # one * for italics, two ** for bold
  map <- setNames(c("*", "**", "~~"), c("italics", "bold", "strikethrough"))
  markup <- map[value]  
  
  for (r in rows){
    for(c in cols){
      
      # Make sure values are not factors
      df[[c]] <- as.character( df[[c]])
      
      # Update formatting
      df[r, c] <- ifelse(nchar(df[r, c])==0,"",paste0(markup, gsub(" ", "", df[r, c]), markup))
    }
  }
  
  return(df)
}
#To produce line breaks in messages and warnings
knitr::knit_hooks$set(
  error = function(x, options) {
    paste('\n\n<div class="alert alert-danger">',
          gsub('##', '\n', gsub('^##\ Error', '**Error**', x)),
          '</div>', sep = '\n')
  },
  warning = function(x, options) {
    paste('\n\n<div class="alert alert-warning">',
          gsub('##', '\n', gsub('^##\ Warning:', '**Warning**', x)),
          '</div>', sep = '\n')
  },
  message = function(x, options) {
    paste('<div class="message">',
          gsub('##', '\n', x),
          '</div>', sep = '\n')
  }
)

#_#_#_#_#_#_#_#_#_#_#_#_#_
invisible("Function to format CreateTableOne into a database")

as.data.frame.TableOne <- function(x, ...) {capture.output(print(x,showAllLevels = TRUE, varLabels = T,...) -> x)
  y <- as.data.frame(x)
  y$characteristic <- dplyr::na_if(rownames(x), "")
  y <- y %>%
    fill(characteristic, .direction = "down") %>%
    dplyr::select(characteristic, everything())
  rownames(y) <- NULL
  y}
#_#_#_#_#_#_#_#_#_#_#_#_#_
# Austin, P. C. (2009). The Relative Ability of Different Propensity 
# Score Methods to Balance Measured Covariates Between 
# Treated and Untreated Subjects in Observational Studies. Medical 
# Decision Making. https://doi.org/10.1177/0272989X09341755
smd_bin <- function(x,y){
  z <- x*(1-x)
  t <- y*(1-y)
  k <- sum(z,t)
  l <- k/2
  
  return((x-y)/sqrt(l))
  
}

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:


if(.Platform$OS.type == "windows") withAutoprint({
  memory.size()
  memory.size(TRUE)
  memory.limit()
})
>   memory.size()
[1] Inf
>   memory.size(TRUE)
[1] Inf
>   memory.limit()
[1] Inf

Resultados

0.a. Historial

Tiempo que demora esta sección: 0.1 minutos

Code
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import pairwise_distances
from sklearn.cluster import KMeans
import seaborn as sns
from matplotlib.patches import Ellipse

# Generar datos artificiales bien centrados
np.random.seed(42)
cluster_1 = np.random.normal(loc=0, scale=0.5, size=(30, 2))
cluster_2 = np.random.normal(loc=5, scale=0.5, size=(30, 2))
cluster_3 = np.random.normal(loc=10, scale=0.5, size=(30, 2))
data = np.vstack([cluster_1, cluster_2, cluster_3])

# Aplicar K-Means con k=3 para obtener las etiquetas (usamos K-Means solo para obtener etiquetas iniciales)
kmeans = KMeans(n_clusters=3, random_state=42).fit(data)
C:\Users\andre\AppData\Local\Programs\Python\PYTHON~1\Lib\site-packages\sklearn\cluster\_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)
Exception in thread Thread-2 (_readerthread):
Traceback (most recent call last):
  File "C:\Users\andre\AppData\Local\Programs\Python\PYTHON~1\Lib\threading.py", line 1038, in _bootstrap_inner
    self.run()
  File "C:\Users\andre\AppData\Local\Programs\Python\PYTHON~1\Lib\threading.py", line 975, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\andre\AppData\Local\Programs\Python\PYTHON~1\Lib\subprocess.py", line 1597, in _readerthread
    buffer.append(fh.read())
                  ^^^^^^^^^
  File "<frozen codecs>", line 322, in decode
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 16: invalid start byte
C:\Users\andre\AppData\Local\Programs\Python\PYTHON~1\Lib\site-packages\joblib\externals\loky\backend\context.py:136: UserWarning: Could not find the number of physical cores for the following reason:
found 0 physical cores < 1
Returning the number of logical cores instead. You can silence this warning by setting LOKY_MAX_CPU_COUNT to the number of cores you want to use.
  warnings.warn(
  File "C:\Users\andre\AppData\Local\Programs\Python\PYTHON~1\Lib\site-packages\joblib\externals\loky\backend\context.py", line 282, in _count_physical_cores
    raise ValueError(f"found {cpu_count_physical} physical cores < 1")
Code
labels = kmeans.labels_

# Calcular los medoides manualmente
medoids = []
for i in np.unique(labels):
    cluster_points = data[labels == i]
    distances = pairwise_distances(cluster_points, metric='euclidean')
    medoid_index = np.argmin(distances.sum(axis=0))
    medoids.append(cluster_points[medoid_index])

medoids = np.array(medoids)

# Crear el gráfico
plt.figure(figsize=(8, 6))
sns.scatterplot(x=data[:, 0], y=data[:, 1], hue=labels, palette="viridis", style=labels, legend=None)
plt.scatter(medoids[:, 0], medoids[:, 1], color='red', s=200, marker='*', label='Medoid')

# Añadir las elipses alrededor de cada cluster (simplificadas)
for i in np.unique(labels):
    cluster_points = data[labels == i]
    mean_x, mean_y = np.mean(cluster_points, axis=0)
    cov_matrix = np.cov(cluster_points.T)
    width = 2 * np.std(cluster_points[:, 0])
    height = 2 * np.std(cluster_points[:, 1])
    ellipse = Ellipse((mean_x, mean_y), width, height, edgecolor='black', facecolor='none', linewidth=2, linestyle='--')
    plt.gca().add_patch(ellipse)

plt.title("Clusters con Medoides Destacados y Elipses Simplificadas")
plt.xlabel("X")
plt.ylabel("Y")
plt.legend()

# Guardar el gráfico en un archivo PNG
plt.savefig("_figs/clusters_kmedoids.png", format="png", dpi=300, bbox_inches='tight')

# Mostrar el gráfico
plt.show()

Tiempo que demora esta sección: 0 minutos

0.b. Descripción tiempo seguimiento

Describir censura incluyendo muerte.

Code
dt_df_filled_quarter_t_desde_primera_adm_expand$cens_time_rec<- ifelse(!is.na(dt_df_filled_quarter_t_desde_primera_adm_expand$death_time)&dt_df_filled_quarter_t_desde_primera_adm_expand$death_time<dt_df_filled_quarter_t_desde_primera_adm_expand$cens_time,
                     dt_df_filled_quarter_t_desde_primera_adm_expand$death_time,
                     dt_df_filled_quarter_t_desde_primera_adm_expand$cens_time)

psych::describe(dt_df_filled_quarter_t_desde_primera_adm_expand$cens_time_rec) %>% 
  knitr::kable("html")
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 12371 17.85584 1.757469 18.00448 17.97795 1.412609 0.0109516 19.98672 19.97577 -4.397878 33.47011 0.015801

Tiempo que demora esta sección: 0 minutos

Ahora por mes

Code
dt_df_filled_month_t_desde_primera_adm_expand$cens_time_rec<- ifelse(!is.na(dt_df_filled_month_t_desde_primera_adm_expand$death_time)&dt_df_filled_month_t_desde_primera_adm_expand$death_time<dt_df_filled_month_t_desde_primera_adm_expand$cens_time,
                     dt_df_filled_month_t_desde_primera_adm_expand$death_time,
                     dt_df_filled_month_t_desde_primera_adm_expand$cens_time)

psych::describe(dt_df_filled_month_t_desde_primera_adm_expand$cens_time_rec) %>% 
  knitr::kable("html")
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 14925 53.63163 5.28762 54.14485 54.0116 4.189116 0.0328549 59.96016 59.92731 -4.455774 33.91993 0.0432816

Tiempo que demora esta sección: 0 minutos

1. PAM (OM), sol 9 cluster

1.1. PAM (OM), sol 9 cluster- diagnósticos

Code
invisible("info de validación de modelos con bootstrap")
# States_Wide.seq_quarter_t_prim_adm_cens, 
# group=om_dist_quarter_c$clustering$cluster9, 
# 
invisible("Hacemos clasificación de pertenencia cluster y ponemos etiquetas")
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_om9 <-
  factor(om_dist_quarter_c$clustering$cluster9,levels=rev(attr( sort(table(om_dist_quarter_c$clustering$cluster9)), "name")),
         labels= c("Un evento, TSM(1)", "Un evento, TUS(4)", "Un evento TSM larga duración(3)", "TSM, 1 año después, TSM(5)", "Un evento, comorbilidad(6)", "TSM, 2 años después, TSM(7)", "TSM, 2 años y medio después, TSM(8)", "Ingresa por TSM, después, otras causas constantemente(9)", "TSM, después, TSM constantemente(2)"))

Tiempo que demora esta sección: 0 minutos

Vemos los diagnósticos que vienen después de aquellos cluster con más de un ingreso.

Code
diag_om9_5<-
df_filled %>% 
  dplyr::filter(run %in% subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, clus_om9=="TSM, 1 año después, TSM(5)")$run) %>% 
  dplyr::select(run, diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11, fecha_egreso_rec_fmt, estab_homo) %>% 
  dplyr::group_by(run) %>%
  dplyr::filter(row_number() != 1) %>%  # Elimina la primera observación de cada run
  dplyr::mutate(
    all_diags = paste(na.omit(c(diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11)), collapse = ", ")
  ) %>%
  dplyr::summarise(
    all_diags = first(all_diags),
    fecha_egreso_rec_fmt = first(fecha_egreso_rec_fmt),
    estab_homo = first(estab_homo)
  ) %>%
  dplyr::ungroup() %>% 
  dplyr::pull(all_diags) %>%  # Extraer la columna all_diags como vector
  strsplit(split = ", ") %>%  # Separar cada diagnóstico por comas
  unlist()  # Convertir la lista en un vector
invisible("head(arrange(data.frame(table(diag_om9_5)),-Freq),20)")
invisible("Para chatgpt= estos son códigos de CIE-10, descríbeme brevemente cada uno en markdown en formato 'Cód. CIE-10 (n=Freq) - [descripción] '")
#
# F322 (n=66) - Episodio depresivo grave sin síntomas psicóticos
# F329 (n=56) - Episodio depresivo no especificado
# F319 (n=48) - Trastorno afectivo bipolar, episodio maníaco, no especificado
# F609 (n=48) - Trastorno de la personalidad, no especificado
# F603 (n=41) - Trastorno de la personalidad emocionalmente inestable, tipo límite
# F209 (n=38) - Esquizofrenia, tipo no especificado
# C490 (n=29) - Neoplasia maligna de tejido conjuntivo y otros tejidos blandos de localización no especificada
# F192 (n=27) - Trastorno mental y del comportamiento debido al uso de múltiples drogas y consumo de otras sustancias psicodislépticas, dependencia
# F200 (n=26) - Esquizofrenia paranoide
# G909 (n=21) - Trastorno del sistema nervioso autónomo, no especificado
# Z511 (n=20) - Atención de radioterapia
# F432 (n=19) - Reacción de estrés agudo
# F431 (n=15) - Trastorno de estrés postraumático (TEPT)
# Z915 (n=13) - Antecedentes personales de traumatismo no clasificado en otra parte
# F608 (n=12) - Otros trastornos de la personalidad específicos
# F312 (n=11) - Trastorno afectivo bipolar, episodio hipomaníaco
# F316 (n=11) - Trastorno afectivo bipolar, episodio mixto
# G409 (n=11) - Epilepsia, no especificada
# J304 (n=11) - Rinitis alérgica, no especificada
# F202 (n=10) - Esquizofrenia catatónica

Tiempo que demora esta sección: 0 minutos

Quienes ingresan un año después por TSM, el segundo episodio se caracteriza por episodios depresivos, trastornos de la personalidad, esquizofrenia, trastornos mentales y comportamentales por múltiples sustancias, estrés agudo y postraumático, afectivo bipolar, trastorno sistema nervioso autónomo.

Code
diag_om9_7<-
df_filled %>% 
  dplyr::filter(run %in% subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, clus_om9=="TSM, 2 años después, TSM(7)")$run) %>% 
  dplyr::select(run, diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11, fecha_egreso_rec_fmt, estab_homo) %>% 
  dplyr::group_by(run) %>%
  dplyr::filter(row_number() != 1) %>%  # Elimina la primera observación de cada run
  dplyr::mutate(
    all_diags = paste(na.omit(c(diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11)), collapse = ", ")
  ) %>%
  dplyr::summarise(
    all_diags = first(all_diags),
    fecha_egreso_rec_fmt = first(fecha_egreso_rec_fmt),
    estab_homo = first(estab_homo)
  ) %>%
  dplyr::ungroup() %>% 
  dplyr::pull(all_diags) %>%  # Extraer la columna all_diags como vector
  strsplit(split = ", ") %>%  # Separar cada diagnóstico por comas
  unlist()  # Convertir la lista en un vector
invisible("head(arrange(data.frame(table(diag_om9_7)),-Freq),20)")
invisible("Para chatgpt= estos son códigos de CIE-10, descríbeme brevemente cada uno en markdown en formato 'Cód. CIE-10 (n=Freq) - [descripción] '")
# F209 (n=28) - Esquizofrenia, tipo no especificado
# F329 (n=28) - Episodio depresivo no especificado
# F609 (n=28) - Trastorno de la personalidad, no especificado
# F319 (n=26) - Trastorno afectivo bipolar, episodio maníaco, no especificado
# F603 (n=25) - Trastorno de la personalidad emocionalmente inestable, tipo límite
# F322 (n=18) - Episodio depresivo grave sin síntomas psicóticos
# F200 (n=16) - Esquizofrenia paranoide
# F29X (n=11) - Psicosis no orgánica, no especificada
# F192 (n=10) - Trastorno mental y del comportamiento debido al uso de múltiples drogas y consumo de otras sustancias psicodislépticas, dependencia
# X610 (n=8) - Autolesión intencional mediante saltar desde un lugar elevado
# F312 (n=7) - Trastorno afectivo bipolar, episodio hipomaníaco
# F314 (n=7) - Trastorno afectivo bipolar, episodio maníaco con síntomas psicóticos
# F239 (n=6) - Trastorno psicótico agudo y transitorio, no especificado
# F432 (n=6) - Reacción de estrés agudo
# R458 (n=6) - Otros síntomas y signos que involucran el estado emocional
# T435 (n=6) - Intoxicación por psicotrópicos no especificados
# E669 (n=5) - Obesidad, no especificada
# F203 (n=5) - Esquizofrenia hebefrénica
# X619 (n=5) - Autolesión intencional, método no especificado
# Z922 (n=5) - Antecedentes de abuso de drogas psicotrópicas

Tiempo que demora esta sección: 0 minutos

Quienes ingresan dos años después por TSM, el segundo episodio se caracteriza por esquizofrenia, episodios depresivos, trastornos de la personalidad, afectivo biopolar, psicosis no orgánica, trastorno por consumo de múltiples drogas u otras sustancias psicodslépitcas, autolesión, estrés agudo, intoxicación por psicotrópicos.

Code
diag_om9_8<-
df_filled %>% 
  dplyr::filter(run %in% subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, clus_om9=="TSM, 2 años y medio después, TSM(8)")$run) %>% 
  dplyr::select(run, diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11, fecha_egreso_rec_fmt, estab_homo) %>% 
  dplyr::group_by(run) %>%
  dplyr::filter(row_number() != 1) %>%  # Elimina la primera observación de cada run
  dplyr::mutate(
    all_diags = paste(na.omit(c(diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11)), collapse = ", ")
  ) %>%
  dplyr::summarise(
    all_diags = first(all_diags),
    fecha_egreso_rec_fmt = first(fecha_egreso_rec_fmt),
    estab_homo = first(estab_homo)
  ) %>%
  dplyr::ungroup() %>% 
  dplyr::pull(all_diags) %>%  # Extraer la columna all_diags como vector
  strsplit(split = ", ") %>%  # Separar cada diagnóstico por comas
  unlist()  # Convertir la lista en un vector
invisible("head(arrange(data.frame(table(diag_om9_8)),-Freq),20)")
invisible("Para chatgpt= estos son códigos de CIE-10, descríbeme brevemente cada uno en markdown en formato 'Cód. CIE-10 (n=Freq) - [descripción] '")
# F209 (n=29) - Esquizofrenia, tipo no especificado
# F319 (n=25) - Trastorno afectivo bipolar, episodio maníaco, no especificado
# F322 (n=19) - Episodio depresivo grave sin síntomas psicóticos
# F609 (n=19) - Trastorno de la personalidad, no especificado
# F192 (n=16) - Trastorno mental y del comportamiento debido al uso de múltiples drogas y consumo de otras sustancias psicodislépticas, dependencia
# F200 (n=14) - Esquizofrenia paranoide
# G909 (n=8) - Trastorno del sistema nervioso autónomo, no especificado
# F29X (n=7) - Psicosis no orgánica, no especificada
# F638 (n=7) - Otros trastornos específicos de la personalidad y del comportamiento
# F639 (n=7) - Trastorno de la personalidad, no especificado
# F431 (n=6) - Trastorno de estrés postraumático (TEPT)
# Z720 (n=6) - Problemas relacionados con el estilo de vida
# Z915 (n=6) - Antecedentes personales de traumatismo no clasificado en otra parte
# E039 (n=5) - Hipotiroidismo, no especificado
# F259 (n=5) - Trastorno esquizoafectivo, no especificado
# F316 (n=5) - Trastorno afectivo bipolar, episodio mixto
# F608 (n=5) - Otros trastornos de la personalidad específicos
# T509 (n=5) - Intoxicación por sustancia no especificada
# E669 (n=4) - Obesidad, no especificada

Tiempo que demora esta sección: 0 minutos

Quienes ingresan dos años y medio después por TSM, el segundo episodio se caracteriza por esquizofrenia, trastorno bipolar, depresivo y de la personalidad, mental y comportamiento por múltiples drogas, trastorno sistema nervioso autónomo, psicósis no orgánica.

Luego vemos la clasificación de PPOO por cluster

Code
janitor::chisq.test(df_filled[,c("run","glosa_pueblo_originario")] %>% 
        dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run", "clus_om9")], by="run", multiple="first") %>% 
        janitor::tabyl(glosa_pueblo_originario, clus_om9))

    Pearson's Chi-squared test

data:  df_filled[, c("run", "glosa_pueblo_originario")] %>% dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,     c("run", "clus_om9")], by = "run", multiple = "first") %>%     janitor::tabyl(glosa_pueblo_originario, clus_om9)
X-squared = 329.43, df = 64, p-value < 2.2e-16

Tiempo que demora esta sección: 0 minutos

Generamos un gráfico de PPOO por cada conglomerado.

Code
ppoo_clus_pre<-
  df_filled[,c("run","glosa_pueblo_originario")] %>% 
  dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run", "clus_om9","factor_inclusivo_real_hist_mas_autperc")], by="run", multiple="first") %>% 
  dplyr::mutate(glosa_pueblo_originario_rec= dplyr::case_when(glosa_pueblo_originario=="NINGUNO" & factor_inclusivo_real_hist_mas_autperc!="00"~ "DESCONOCIDO", T~glosa_pueblo_originario)) %>% 
  janitor::tabyl(glosa_pueblo_originario_rec, clus_om9) %>% 
  janitor::adorn_percentages("row")

reshape2::melt(ppoo_clus_pre, id.vars = "glosa_pueblo_originario_rec") %>% 
  dplyr::mutate(glosa_pueblo_originario_rec= 
    dplyr::recode(glosa_pueblo_originario_rec, 
      "OTRO (ESPECIFICAR)"="OTRO(n=77)", 
      "RAPA NUI (PASCUENSE)"="RAPA NUI(n=34)", 
      "YAGÁN (YÁMANA)"="YAGÁN(n=2)",
      "AYMARA"="AYMARA(n=13)",
      "COLLA"="COLLA(n=6)",
      "DIAGUITA"="DIAGUITA(n=3)",
      "KAWÉSQAR"="KAWÉSQAR(n=4)",
      "MAPUCHE"="MAPUCHE(n=255)",
      "DESCONOCIDO"=".DESCONOCIDO(n=1.985)",
      "NINGUNO"=".NINGUNO(n=9.156)")) %>% 
  #dplyr::filter(glosa_pueblo_originario!="NINGUNO") %>% 
  # dplyr::mutate(variable= 
  #   dplyr::recode(variable, "6036_TSM, 1 año después, otras causas"="6036_TSM, 1 año\ndespués, otras causas",
  #                  "5710_TSM, 1 año después, TSM"="5710_TSM, 1 año\ndespués, TSM",
  #                 "5939_Un evento TSM larga duración"="5939_Un evento TSM\nlarga duración",
  #                 "5989_Un evento, comorbilidad"="5989_Un evento,\ncomorbilidad")) %>% 
ggplot(aes(x = glosa_pueblo_originario_rec, y = value, fill = variable)) + 
  geom_bar(stat = "identity", position = "fill") + 
  scale_fill_manual(values = c("#E27A5B", "#6B8E23", "#D2B48C", "#696969", "#BDB76B", "#4682B4", "#8B4513", "#708090", "#8FBC8F")) +
  labs(title = NULL,
       x = "Grupo Étnico",
       y = "Proporción de Casos",
       fill = "Grupos") +  # Cambia el título de la leyenda a "Grupos"
  theme_minimal() +
  theme(
    axis.text.y = element_text(size = 12),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 12),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 14),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 14),          # Tamaño del título del eje Y
    plot.title = NULL,  # Tamaño y estilo del título del gráfico
    legend.title = element_text(size = 14, margin = margin(b = -.1)),          # Tamaño del título de la leyenda
    legend.spacing.y = unit(1.5, "lines"),
    legend.box.spacing = unit(0.5, "lines"),      # Controla el espacio entre la leyenda y el gráfico
    legend.margin = margin(5, 5, 5, 5),  
    legend.key.height = unit(1, "cm"),  
    legend.text = element_text(size = 12)            # Tamaño del texto de la leyenda
    ) + 
  coord_flip()  # Hacer el gráfico horizontal
ggsave("_figs/grafico_ancho_achatado_om9.png", width = 10, height = 5, dpi=1000)
PPOO por cluster

PPOO por cluster

Tiempo que demora esta sección: 0 minutos

Vemos los gráficos de las trayectorias

Code
categories_om9<-attr(States_Wide.seq_quarter_t_prim_adm_cens, "labels")
new_labels <- categories_om9
new_labels[which(categories_om9 == "Otras causas")] <- "Otras\ncausas"
#new_labels[which(categories == "Consumo\nde sustancias")] <- "Consumo de\nsustancias"

seq_plot_om9 <- ggseqiplot(States_Wide.seq_quarter_t_prim_adm_cens, 
                       group=factor(om_dist_quarter_c$clustering$cluster9,levels=rev(attr( sort(table(om_dist_quarter_c$clustering$cluster9)), "name")),
         labels= c("Un evento, TSM(1)", "Un evento, TUS(4)", "Un evento TSM\nlarga duración(3)", "TSM, 1 año después,\nTSM(5)", "Un evento,\ncomorbilidad(6)", "TSM, 2 años después,\nTSM(7)", "TSM, 2 años y medio\ndespués, TSM(8)", "Ingresa por TSM, después, otras\ncausas constantemente(9)", "TSM, después, TSM\nconstantemente(2)")), 
                       facet_ncol=3, facet_nrow=3) +
  theme(legend.position = "none")+
  labs(x="Trimestres", y="# IDs de usuarios")+
  #guides(fill = guide_legend(nrow = 1))+
    theme(
    panel.spacing = unit(0.1, "lines"),  # Reduce el espaciado entre los paneles
    axis.text.y = element_text(size = 15),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 15),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 15),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 15, margin = margin(r = -10)),#,margin = margin(l = -10)),
    strip.text = element_text(size = 11, margin = margin(b =-15)),
    legend.text = element_text(size = 15),
    legend.spacing.x = unit(0.1, 'cm'),  # Alinea el título de la leyenda hacia la izquierda
    legend.box.margin = margin(t = 0, r = 0, b = 0, l = -50),
    legend.position = "bottom", 
    legend.justification = "left",
    panel.spacing.y = unit(0.5, "lines"),
    strip.placement = "outside",   # Para colocar las tiras fuera de los ejes
    strip.background = element_blank() # Elimina el fondo para que parezca más espacioso
    #legend.key.size = unit(1.5, "lines"),        # Aumenta el tamaño de los símbolos en la leyenda
  )+
  guides(fill = guide_legend(nrow = 1)) +
  scale_fill_manual(labels = new_labels, values=c("#E2725B", "#556B2F", "#D2B48C",#"#8B4513",
                                                  "#FFFFFF","#808080","#000000"))
seq_plot_om9
ggsave(filename="_figs/clustershc_om9_mod.png", seq_plot_om9,  width = 8.5, height = 5.5, dpi=1000)
Trayectorias de hospitalización, orden de sujetos según el primer estado observado y su duración, representando a cada individuo como una línea en el gráfico.

Trayectorias de hospitalización, orden de sujetos según el primer estado observado y su duración, representando a cada individuo como una línea en el gráfico.

Tiempo que demora esta sección: 0.3 minutos

Code
seq_plot2_om9 <- ggseqdplot(States_Wide.seq_quarter_t_prim_adm_cens, 
                       group=factor(om_dist_quarter_c$clustering$cluster9,levels=rev(attr( sort(table(om_dist_quarter_c$clustering$cluster9)), "name")),
         labels= c("Un evento, TSM(1)", "Un evento, TUS(4)", "Un evento TSM\nlarga duración(3)", "TSM, 1 año después,\nTSM(5)", "Un evento,\ncomorbilidad(6)", "TSM, 2 años después,\nTSM(7)", "TSM, 2 años y medio\ndespués, TSM(8)", "Ingresa por TSM, después, otras\ncausas constantemente(9)", "TSM, después, TSM\nconstantemente(2)")), 
                       facet_ncol=3, facet_nrow=3) +
  theme(legend.position = "none")+  # Colocar la leyenda abajo
  labs(x="Trimestres", y="Frecuencia relativa de estados")+
  theme(
    panel.spacing = unit(0.1, "lines"),
    axis.text.y = element_text(size = 15),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 15),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 15),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 15, margin = margin(r = -5)),
    strip.text = element_text(size = 11),
    panel.spacing.y = unit(0.5, "lines"),
    strip.placement = "outside",   # Para colocar las tiras fuera de los ejes
    strip.background = element_blank() # Elimina el fondo para que parezca más espacioso
    #legend.key.size = unit(1.5, "lines"),        # Aumenta el tamaño de los símbolos en la leyenda    
  )  # Colocar la leyenda abajo
seq_plot2_om9
ggsave("_figs/clustershc_om92_mod.png",seq_plot2_om9, width = 8.5, height = 5.5, dpi=1000)


table_data <- sprintf("%1.2f",om_dist_quarter_c$stats[8,])
table_data <-as.data.frame(t(table_data))
colnames(table_data)<-attr(om_dist_quarter_c$stats, "name")
table_data %>% knitr::kable()
PBC HG HGSD ASW ASWw CH R2 CHsq R2sq HC
0.58 0.78 0.77 0.55 0.55 494.70 0.40 813.10 0.52 0.10

Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Tiempo que demora esta sección: 0.1 minutos

De este modo, presenta el cambio agregado en la distribución de estados a lo largo del tiempo, sin considerar las secuencias individuales.

1.1.1.Exploración transiciones

1.1.1.a Transiciones- RM y no RM

Tasas de transición no RM a RM y viceversa

Code
invisible("Tasas de transición no RM a RM y viceversa")

trim_tasa_hc_clus9_cens_cnt<-  
  seqcount_t(States_Wide.seq_quarter_t_prim_adm_RM_cens, 
             group=factor(om_dist_quarter_c$clustering$cluster9,levels=rev(attr( sort(table(om_dist_quarter_c$clustering$cluster9)), "name")),
         labels= c("Un evento, TSM(1)", "Un evento, TUS(4)", "Un evento TSM\nlarga duración(3)", "TSM, 1 año después,\nTSM(5)", "Un evento,\ncomorbilidad(6)", "TSM, 2 años después,\nTSM(7)", "TSM, 2 años y medio\ndespués, TSM(8)", "Ingresa por TSM, después, otras\ncausas constantemente(9)", "TSM, después, TSM\nconstantemente(2)"))) %>% 
  dplyr::filter(count>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .))) 
trim_tasa_hc_clus9_cens_rate<-  
  seqtrate_t(States_Wide.seq_quarter_t_prim_adm_RM_cens, 
             group=factor(om_dist_quarter_c$clustering$cluster9,levels=rev(attr( sort(table(om_dist_quarter_c$clustering$cluster9)), "name")),
         labels= c("Un evento, TSM(1)", "Un evento, TUS(4)", "Un evento TSM\nlarga duración(3)", "TSM, 1 año después,\nTSM(5)", "Un evento,\ncomorbilidad(6)", "TSM, 2 años después,\nTSM(7)", "TSM, 2 años y medio\ndespués, TSM(8)", "Ingresa por TSM, después, otras\ncausas constantemente(9)", "TSM, después, TSM\nconstantemente(2)"))) %>% 
  dplyr::filter(rate>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .)))

Tiempo que demora esta sección: 0 minutos

Code
trim_tasa_hc_clus9_cens_rate %>%   
  dplyr::left_join(trim_tasa_hc_clus9_cens_cnt, by=c("from"="from", "glosa_sexo"="glosa_sexo","to"="to")) %>% 
  dplyr::rename("recuento"="count") %>% 
  dplyr::filter(from %in% c("RM", "noRM")) %>%  
  ggplot(aes(x = from, y = to, fill = rate, size=log(recuento+1))) +
  geom_tile() +
  coord_flip()+
  scale_fill_gradient(low = "white", high = "blue") + # Ajusta la escala de colores según tus preferencias
  labs(title = "Tasas de transición, Trimestre (s/censura)",
       x = "Desde",
       y = "Hacia",
       fill = "Rate") +
  theme_minimal() +
  facet_wrap(~glosa_sexo)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  geom_text(aes(label = sprintf("%1.2f", rate), size =log(recuento+1)*.5), color = "black")

invisible("Hay muy pocos casos que se entrecruzan entre noRM y RM (fuera de la diagnonal)")
Porcentajes de transición no-RM y RM por cada cluster

Porcentajes de transición no-RM y RM por cada cluster

Tiempo que demora esta sección: 0.1 minutos

Hay muy pocos casos que se entrecruzan entre noRM y RM (fuera de la diagnonal)

1.1.1.b Transiciones
Code
trim_tasa2_hc_clus9_cens_cnt<-  
  seqcount_t(States_Wide.seq_quarter_t_prim_adm_cens, 
             group=factor(om_dist_quarter_c$clustering$cluster9,levels=rev(attr( sort(table(om_dist_quarter_c$clustering$cluster9)), "name")),
         labels= c("Un evento, TSM(1)", "Un evento, TUS(4)", "Un evento TSM\nlarga duración(3)", "TSM, 1 año después,\nTSM(5)", "Un evento,\ncomorbilidad(6)", "TSM, 2 años después,\nTSM(7)", "TSM, 2 años y medio\ndespués, TSM(8)", "Ingresa por TSM, después, otras\ncausas constantemente(9)", "TSM, después, TSM\nconstantemente(2)"))) %>% 
  dplyr::filter(count>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .))) 
trim_tasa2_hc_clus9_cens_rate<-  
  seqtrate_t(States_Wide.seq_quarter_t_prim_adm_cens, 
             group=factor(om_dist_quarter_c$clustering$cluster9,levels=rev(attr( sort(table(om_dist_quarter_c$clustering$cluster9)), "name")),
         labels= c("Un evento, TSM(1)", "Un evento, TUS(4)", "Un evento TSM\nlarga duración(3)", "TSM, 1 año después,\nTSM(5)", "Un evento,\ncomorbilidad(6)", "TSM, 2 años después,\nTSM(7)", "TSM, 2 años y medio\ndespués, TSM(8)", "Ingresa por TSM, después, otras\ncausas constantemente(9)", "TSM, después, TSM\nconstantemente(2)"))) %>% 
  dplyr::filter(rate>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .)))

Tiempo que demora esta sección: 0 minutos

Code
trim_tasa2_hc_clus9_cens_rate %>%   
  dplyr::left_join(trim_tasa2_hc_clus9_cens_cnt, by=c("from"="from", "glosa_sexo"="glosa_sexo","to"="to")) %>% 
  dplyr::rename("recuento"="count") %>% 
  #dplyr::filter(from %in% c("RM", "noRM")) %>%  
  ggplot(aes(x = from, y = to, fill = rate, size=log(recuento+1))) +
  geom_tile() +
  coord_flip()+
  scale_fill_gradient(low = "white", high = "blue") + # Ajusta la escala de colores según tus preferencias
  labs(title = "Tasas de transición, Trimestre (s/censura)",
       x = "Desde",
       y = "Hacia",
       fill = "Rate") +
  theme_minimal() +
  facet_wrap(~glosa_sexo)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  geom_text(aes(label = sprintf("%1.2f", rate), size =log(recuento+1)*.5), color = "black")
Porcentajes de transición no-RM y RM por cada cluster

Porcentajes de transición no-RM y RM por cada cluster

Tiempo que demora esta sección: 0.1 minutos

1.1.1.c Tiempo promedio por cluster
Code
seq_mean_t(States_Wide.seq_quarter_t_prim_adm_cens, 
             group=factor(om_dist_quarter_c$clustering$cluster9,levels=rev(attr( sort(table(om_dist_quarter_c$clustering$cluster9)), "name")),
         labels= c("Un evento, TSM(1)", "Un evento, TUS(4)", "Un evento TSM\nlarga duración(3)", "TSM, 1 año después,\nTSM(5)", "Un evento,\ncomorbilidad(6)", "TSM, 2 años después,\nTSM(7)", "TSM, 2 años y medio\ndespués, TSM(8)", "Ingresa por TSM, después, otras\ncausas constantemente(9)", "TSM, después, TSM\nconstantemente(2)"))) %>%   
  data.table::as.data.table(keep.rowname=T) %>% 
  ggplot(aes(x=rn, fill= factor_inclusivo, y=Mean))+
  geom_bar(width = 1, stat = "identity") +
  theme_minimal() +
  labs(title = NULL,
       x = NULL,
       y = NULL) +
  coord_flip()+
  theme(#axis.text.x = element_blank(),
    #axis.text.y = element_blank(),
    panel.grid = element_blank()) +
#  scale_fill_brewer(palette = "Pastel1", labels=c("Sin\nautoidentificación\nni reconocimiento", "Autoidentificación\nsin reconocimiento", "Ambas")) +
  geom_text(aes(label = round(Mean,1)), 
            position = position_stack(vjust = 0.5), 
            size = 2.5, # Ajusta el tamaño de la fuente aquí
            color = "black", # Color del texto
            family = "sans", # Puedes cambiar la fuente si lo deseas
            background = element_rect(fill = "white", color = NA)) + # Fondo blanco
  theme(legend.title = element_blank())

invisible("No me aporta mucho")
# seq_mean_t_dos_grupos(States_Wide.seq_quarter_t_prim_adm_cens, group1=ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam, group2=ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc)
Tiempo promedio en cada estado por estatus PPOO (Trimestral c/censura)

Tiempo promedio en cada estado por estatus PPOO (Trimestral c/censura)

Tiempo que demora esta sección: 0.1 minutos

1.1.3. Comparación variables

1.1.3.a. Comparación covariables- PPOO
Code
# round(
# prop.table(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_om9, 
#                  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc),1),
# 2)

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  count(clus_om9, factor_inclusivo_real_hist_mas_autperc) %>%
  group_by(clus_om9) %>%
  mutate(prop = scales::percent(n / sum(n))) %>%
  select(-n) %>%
  pivot_wider(names_from = factor_inclusivo_real_hist_mas_autperc, values_from = prop, values_fill = "0") %>% knitr::kable("markdown", col.names=c("Conglomerados","No se identifica/no pertenece", "No se identifica/hay reconocimiento", "Se identifica/hay reconocimeinto"), caption="Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO")
#        00   10   11
# 6035 0.81 0.11 0.08
# 6025 0.79 0.12 0.10
# 5939 0.83 0.11 0.07
# 5989 0.84 0.09 0.08
# 6036 0.80 0.11 0.09
# 5710 0.79 0.12 0.09
invisible("6025 tiwnw un poxo mas PPOO, lo mismo con 5710")
Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO
Conglomerados No se identifica/no pertenece No se identifica/hay reconocimiento Se identifica/hay reconocimeinto
Un evento, TSM(1) 80.7% 11.1% 8.2%
Un evento, TUS(4) 78.5% 11.5% 10.0%
Un evento TSM larga duración(3) 78.0% 12.5% 9.5%
TSM, 1 año después, TSM(5) 80.5% 10.6% 8.8%
Un evento, comorbilidad(6) 84.2% 8.6% 7.2%
TSM, 2 años después, TSM(7) 85.5% 10.3% 4.1%
TSM, 2 años y medio después, TSM(8) 85.2% 8.6% 6.2%
Ingresa por TSM, después, otras causas constantemente(9) 69% 25% 6%
TSM, después, TSM constantemente(2) 73% 13% 13%

Tiempo que demora esta sección: 0 minutos

Vemos las categorías de clasificación de PPOO según autopercepción (en MINSAL y en RSH) y reconocimiento CONADI.

Code
#table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc)

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc,clus_om9) %>%
    janitor::chisq.test()
#X-squared = 14.742, df = 16, p-value = 0.5436
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc,clus_om9) %>%
    janitor::fisher.test(simulate.p.value=T, B=1e5)
# data:  .
# p-value = 0.4859
# alternative hypothesis: two.sided

    Pearson's Chi-squared test

data:  .
X-squared = 14.742, df = 16, p-value = 0.5436


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.4871
alternative hypothesis: two.sided

Tiempo que demora esta sección: 0 minutos

Code
chisq.posthoc.test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_om9, ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc), method = "bonferroni", round=4) %>% 
    pivot_longer(cols = c(`00`, `10`, `11`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    #separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    #dplyr::filter(Group==1) %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", Residuals)) %>% 
    dplyr::select(Dimension, Residuals, `p values`) %>% 
  knitr::kable("markdown", col.names=c("Código-Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. Pertenencia/identificación PPOO")
Post-hoc, conglomerado vs. Pertenencia/identificación PPOO
Código-Descripción Residuos Sig.
Un evento, TSM(1) 0.49 1
Un evento, TSM(1) -0.01 1
Un evento, TSM(1) -0.69 1
Un evento, TUS(4) -1.45 1
Un evento, TUS(4) 0.33 1
Un evento, TUS(4) 1.70 1
Un evento TSM larga duración(3) -1.20 1
Un evento TSM larga duración(3) 0.83 1
Un evento TSM larga duración(3) 0.77 1
TSM, 1 año después, TSM(5) -0.00 1
TSM, 1 año después, TSM(5) -0.25 1
TSM, 1 año después, TSM(5) 0.29 1
Un evento, comorbilidad(6) 1.36 1
Un evento, comorbilidad(6) -1.18 1
Un evento, comorbilidad(6) -0.61 1
TSM, 2 años después, TSM(7) 1.53 1
TSM, 2 años después, TSM(7) -0.30 1
TSM, 2 años después, TSM(7) -1.85 1
TSM, 2 años y medio después, TSM(8) 1.06 1
TSM, 2 años y medio después, TSM(8) -0.72 1
TSM, 2 años y medio después, TSM(8) -0.71 1
Ingresa por TSM, después, otras causas constantemente(9) -1.19 1
Ingresa por TSM, después, otras causas constantemente(9) 1.77 1
Ingresa por TSM, después, otras causas constantemente(9) -0.30 1
TSM, después, TSM constantemente(2) -0.71 1
TSM, después, TSM constantemente(2) 0.27 1
TSM, después, TSM constantemente(2) 0.70 1

Tiempo que demora esta sección: 0 minutos

Ahora lo hacemos con la versión binarizada

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc_bin<- ifelse(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc=="00",0,1)

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc_bin,clus_om9) %>%
    janitor::chisq.test()
#X-squared = 10.413, df = 8, p-value = 0.2372

    Pearson's Chi-squared test

data:  .
X-squared = 10.413, df = 8, p-value = 0.2372

Tiempo que demora esta sección: 0 minutos

Code
round(prop.table(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_om9, ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc_bin),1),2) %>% knitr::kable("markdown", col.names=c("Conglomerados","No se identifica/no pertenece", "Se identifica/pertenece"), caption="Porcentajes por fila, conglomerado vs. Pertenencia/identificación PPOO")
Porcentajes por fila, conglomerado vs. Pertenencia/identificación PPOO
Conglomerados No se identifica/no pertenece Se identifica/pertenece
Un evento, TSM(1) 0.81 0.19
Un evento, TUS(4) 0.78 0.22
Un evento TSM larga duración(3) 0.78 0.22
TSM, 1 año después, TSM(5) 0.81 0.19
Un evento, comorbilidad(6) 0.84 0.16
TSM, 2 años después, TSM(7) 0.86 0.14
TSM, 2 años y medio después, TSM(8) 0.85 0.15
Ingresa por TSM, después, otras causas constantemente(9) 0.69 0.31
TSM, después, TSM constantemente(2) 0.73 0.27

Tiempo que demora esta sección: 0 minutos

Hicimos una prueba post-hoc usando Bonferroni

Code
# 
# Beasley, T. M., & Schumacker, R. E. (1995). Multiple Regression Approach to Analyzing Contingency
# Tables: Post Hoc and Planned Comparison Procedures. The Journal of Experimental Education, 64(1), 79–93. https://doi.org/10.1080/00220973.1995.9943797

chisq.posthoc.test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_om9, ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc_bin), method = "bonferroni") %>% 
    pivot_longer(cols = c(`0`, `1`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    #separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group==1) %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", Residuals)) %>% 
    select(Dimension, Residuals, `p values`) %>% 
  knitr::kable("markdown", col.names=c("Código-Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. Pertenencia/identificación PPOO")
Post-hoc, conglomerado vs. Pertenencia/identificación PPOO
Código-Descripción Residuos Sig.
Un evento, TSM(1) -0.49 1
Un evento, TUS(4) 1.45 1
Un evento TSM larga duración(3) 1.20 1
TSM, 1 año después, TSM(5) 0.00 1
Un evento, comorbilidad(6) -1.36 1
TSM, 2 años después, TSM(7) -1.53 1
TSM, 2 años y medio después, TSM(8) -1.06 1
Ingresa por TSM, después, otras causas constantemente(9) 1.19 1
TSM, después, TSM constantemente(2) 0.71 1

Tiempo que demora esta sección: 0 minutos

1.1.3.b. Comparación covariables- Mortalidad
Code
# 
invisible("No hay nada, el tiempo promedio de censura es similar")

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
  janitor::tabyl(clus_om9,death_time_rec) %>% 
  janitor::adorn_percentages("row")%>%
  dplyr::mutate(`1`=scales::percent(`1`, accuracy=.1)) %>% 
  dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::group_by(clus_om9) %>% 
  dplyr::summarise(mean=sprintf("%1.1f",mean(cens_time))), by="clus_om9") %>% 
  dplyr::select(-`0`) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado","Mortalidad observada", "Promedio"), caption="Post-hoc, conglomerado vs. Mortalidad y tiempo a censura")
Post-hoc, conglomerado vs. Mortalidad y tiempo a censura
Conglomerado Mortalidad observada Promedio
Un evento, TSM(1) 0.8% 17.9
Un evento, TUS(4) 1.8% 18.2
Un evento TSM larga duración(3) 2.4% 17.9
TSM, 1 año después, TSM(5) 1.3% 18.0
Un evento, comorbilidad(6) 1.9% 18.1
TSM, 2 años después, TSM(7) 2.8% 17.9
TSM, 2 años y medio después, TSM(8) 0.0% 18.2
Ingresa por TSM, después, otras causas constantemente(9) 18.8% 18.2
TSM, después, TSM constantemente(2) 6.7% 18.2

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
             janitor::tabyl(death_time_rec,clus_om9) %>% 
              janitor::chisq.test(correct=T)
#X-squared = 64.113, df = 8, p-value = 7.225e-11

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
             janitor::tabyl(death_time_rec,clus_om9) %>% 
              janitor::fisher.test(simulate.p.value=T, B=1e5)
#p-value = 4e-05
invisible("no se basa en la distribución chi-cuadrado. Fisher se basa en permutaciones exactas, por lo que no se calculan df.")

invisible("Podría haber algo aquí, aunque son números pequeños")
invisible("6036 (morbilidad y a los 4 meses otras causas) y 6035 (sólo un evento por trno.SM) tienen un 1% de gente que muere antes")
invisible("5939 (dos semestres continuos por morbilidad psiquiátrica) en cambio, tiene 2.2%")

#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_
##_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_
tabla_cluster_mortalidad_om9<- 
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1))

chisq.posthoc.test(table(tabla_cluster_mortalidad_om9$clus_om9,
                         tabla_cluster_mortalidad_om9$death_time_rec))%>% 
    pivot_longer(cols = c(`0`, `1`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    #separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group==1) %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", as.numeric(Residuals))) %>% 
    select(Dimension, Residuals, `p values`) %>% 
  knitr::kable("markdown", col.names=c("Código-Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. mortalidad")

    Pearson's Chi-squared test

data:  .
X-squared = 64.113, df = 8, p-value = 7.225e-11


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 2e-05
alternative hypothesis: two.sided
Post-hoc, conglomerado vs. mortalidad
Código-Descripción Residuos Sig.
Un evento, TSM(1) -4.10 7e-04*
Un evento, TUS(4) 1.58 1
Un evento TSM larga duración(3) 2.24 0.4566
TSM, 1 año después, TSM(5) 0.24 1
Un evento, comorbilidad(6) 1.04 1
TSM, 2 años después, TSM(7) 1.82 1
TSM, 2 años y medio después, TSM(8) -0.98 1
Ingresa por TSM, después, otras causas constantemente(9) 6.58 0*
TSM, después, TSM constantemente(2) 2.00 0.8286

Tiempo que demora esta sección: 0 minutos

1.1.3.c. Comparación covariables- no RM vs. RM
Code
round(prop.table(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_om9,ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base),1),3) %>% 
    data.frame() %>% 
    dplyr::mutate(Freq= scales::percent(Freq, accuracy=1)) %>% 
    tidyr::pivot_wider(names_from="Var2",values_from="Freq") %>% 
  knitr::kable("markdown", caption="Porcentajes por fila")
Porcentajes por fila
Var1 noRM RM
Un evento, TSM(1) 54% 46%
Un evento, TUS(4) 64% 36%
Un evento TSM larga duración(3) 50% 50%
TSM, 1 año después, TSM(5) 44% 56%
Un evento, comorbilidad(6) 42% 58%
TSM, 2 años después, TSM(7) 50% 50%
TSM, 2 años y medio después, TSM(8) 60% 40%
Ingresa por TSM, después, otras causas constantemente(9) 44% 56%
TSM, después, TSM constantemente(2) 73% 27%

Tiempo que demora esta sección: 0 minutos

Code
janitor::chisq.test(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
                      janitor::tabyl(codigo_region_rec_base,clus_om9), correct=T)
# X-squared = 39.996, df = 5, p-value = 1.496e-07

chisq.posthoc.test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_om9,ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base))%>% 
    pivot_longer(cols = c(`noRM`, `RM`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    #separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group=="RM") %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", as.numeric(Residuals))) %>% 
    dplyr::mutate( `p values`= sprintf("%1.3f", as.numeric(gsub("\\*","",`p values`)))) %>% 
    select(Dimension, Residuals, `p values`) %>% 
  dplyr::mutate(`p values`= ifelse(`p values`=="0.000","<0.001",`p values`)) %>% 
  knitr::kable("markdown", col.names=c("Código-Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. atendido en RM")

    Pearson's Chi-squared test

data:  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%     janitor::tabyl(codigo_region_rec_base, clus_om9)
X-squared = 53.905, df = 8, p-value = 7.203e-09
Post-hoc, conglomerado vs. atendido en RM
Código-Descripción Residuos Sig.
Un evento, TSM(1) 0.26 1.000
Un evento, TUS(4) -5.30 <0.001
Un evento TSM larga duración(3) 1.44 1.000
TSM, 1 año después, TSM(5) 3.00 0.048
Un evento, comorbilidad(6) 3.66 0.005
TSM, 2 años después, TSM(7) 1.06 1.000
TSM, 2 años y medio después, TSM(8) -1.18 1.000
Ingresa por TSM, después, otras causas constantemente(9) 0.82 1.000
TSM, después, TSM constantemente(2) -1.50 1.000

Tiempo que demora esta sección: 0 minutos

1.1.3.e. Comparación covariables- Región
Code
tabla_cluster_region_om9<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(codigo_region, clus_om9) %>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2)

colnames(tabla_cluster_region_om9)<- c("reg", "c1", "c4", "c3", "c5", "c6", "c7", "c8", "c9", "c2")
cod_reg_homo_om9<-
data.frame(
  codigo_region = 1:16,
  nombre_region = c(
    "Región de Tarapacá",
    "Región de Antofagasta",
    "Región de Atacama",
    "Región de Coquimbo",
    "Región de Valparaíso",
    "Región del Libertador General Bernardo O'Higgins",
    "Región del Maule",
    "Región del Biobío",
    "Región de La Araucanía",
    "Región de Los Lagos",
    "Región de Aysén del General Carlos Ibáñez del Campo",
    "Región de Magallanes y de la Antártica Chilena",
    "Región Metropolitana de Santiago",
    "Región de Los Ríos",
    "Región de Arica y Parinacota",
    "Región de Ñuble"
  ),
  stringsAsFactors = FALSE
)

dplyr::mutate(tabla_cluster_region_om9, promedio_fila = rowMeans(across(2:10))) %>% 
  dplyr::arrange(desc(promedio_fila)) %>% 
  dplyr::left_join(cod_reg_homo_om9, by=c("reg"="codigo_region")) %>% 
  dplyr::select(reg, nombre_region, everything()) %>% 
  dplyr::select(-promedio_fila) %>% 
  dplyr::mutate_at(3:11,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentaje por comunas")
Porcentaje por comunas
reg nombre_region c1 c4 c3 c5 c6 c7 c8 c9 c2
13 Región Metropolitana de Santiago 45% 35% 48% 51% 57% 43% 35% 44% 27%
5 Región de Valparaíso 9% 13% 10% 5% 6% 10% 11% 6% 27%
10 Región de Los Lagos 6% 20% 5% 4% 10% 6% 12% 6% 0%
8 Región del Biobío 10% 9% 9% 9% 9% 10% 5% 0% 7%
12 Región de Magallanes y de la Antártica Chilena 1% 2% 3% 1% 1% 2% 2% 19% 7%
9 Región de La Araucanía 5% 4% 6% 8% 4% 6% 4% 0% 0%
16 Región de Ñuble 2% 2% 2% 3% 1% 2% 5% 12% 7%
1 Región de Tarapacá 3% 1% 1% 2% 1% 1% 4% 6% 13%
6 Región del Libertador General Bernardo O’Higgins 4% 3% 4% 1% 2% 2% 9% 0% 7%
7 Región del Maule 4% 3% 3% 4% 4% 5% 2% 6% 0%
2 Región de Antofagasta 2% 1% 2% 3% 1% 3% 4% 0% 0%
11 Región de Aysén del General Carlos Ibáñez del Campo 2% 2% 1% 2% 3% 5% 1% 0% 0%
14 Región de Los Ríos 3% 3% 2% 3% 0% 1% 2% 0% 0%
15 Región de Arica y Parinacota 2% 0% 1% 0% 0% 1% 0% 0% 7%
3 Región de Atacama 2% 1% 2% 2% 0% 1% 1% 0% 0%
4 Región de Coquimbo 1% 1% 1% 0% 0% 1% 2% 0% 0%

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(codigo_region, clus_om9) %>% 
  janitor::fisher.test(simulate.p.value=T, B=1e5)

    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 1e-05
alternative hypothesis: two.sided

Tiempo que demora esta sección: 0 minutos

Code
#p-value = 1e-05
tab_clus_reg_om9<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                      by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
    janitor::tabyl(codigo_region, clus_om9)

chisq.posthoc.test(tab_clus_reg_om9[-1]) %>% 
  dplyr::mutate_at(3:11, ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
  knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")

Warning in chisq.test(x, …): Chi-squared approximation may be incorrect

Comparación post-hoc, conglomerado-región
Dimension Value Un evento, TSM(1) Un evento, TUS(4) Un evento TSM larga duración(3) TSM, 1 año después, TSM(5) Un evento, comorbilidad(6) TSM, 2 años después, TSM(7) TSM, 2 años y medio después, TSM(8) Ingresa por TSM, después, otras causas constantemente(9) TSM, después, TSM constantemente(2)
1 Residuals 2.258 -1.772 -1.702 -0.529 -0.837 -0.739 0.860 1.063 2.867
1 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.597
2 Residuals 1.394 -2.272 0.243 0.873 -1.285 0.416 0.886 -0.608 -0.589
2 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
3 Residuals 0.962 -0.478 0.445 0.286 -1.840 -0.159 -0.225 -0.501 -0.485
3 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
4 Residuals 1.415 -0.973 -0.019 -1.483 -1.424 0.575 1.457 -0.388 -0.375
4 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
5 Residuals -1.829 3.623 0.748 -2.189 -1.651 0.304 0.688 -0.378 2.408
5 p values 1.000 0.042 1.000 1.000 1.000 1.000 1.000 1.000 1.000
6 Residuals 1.147 -0.471 0.416 -1.847 -1.308 -0.981 2.485 -0.770 0.650
6 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
7 Residuals 1.570 -1.679 -0.886 0.339 -0.123 0.521 -0.705 0.462 -0.791
7 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
8 Residuals 1.699 -1.176 -0.213 -0.272 -0.361 0.214 -1.487 -1.322 -0.411
8 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
9 Residuals -0.488 -1.173 0.672 2.648 -0.298 0.844 -0.441 -0.893 -0.865
9 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
10 Residuals -7.042 12.357 -2.006 -2.427 0.980 -0.718 1.543 -0.229 -1.127
10 p values 0.000 0.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
11 Residuals -1.000 0.810 -1.393 0.286 0.974 2.530 -0.471 -0.565 -0.547
11 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
12 Residuals -2.215 0.262 2.367 -0.226 -0.664 0.562 0.715 5.669 1.642
12 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000 1.000
13 Residuals 1.011 -4.945 1.509 2.172 3.748 -0.375 -1.773 -0.043 -1.376
13 p values 1.000 0.000 1.000 1.000 0.026 1.000 1.000 1.000 1.000
14 Residuals 1.007 0.669 -0.501 0.514 -1.943 -1.447 -0.056 -0.650 -0.629
14 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
15 Residuals 3.842 -2.839 -0.980 -1.392 -1.295 -0.190 -1.146 -0.506 1.587
15 p values 0.018 0.652 1.000 1.000 1.000 1.000 1.000 1.000 1.000
16 Residuals -0.288 -0.105 -0.924 0.852 -0.824 -0.164 1.624 2.752 1.145
16 p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.853 1.000

Tiempo que demora esta sección: 0 minutos

Por macrozona

Code
tabla_cluster_macrozona_om9<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
dplyr::mutate(macrozona = dplyr::case_when(
  codigo_region %in% c(15, 1, 2, 3) ~ "Macrozona Norte",
  codigo_region %in% c(4, 5)~ "Macrozona Centro",
  codigo_region %in% c(6, 7, 16, 8) ~ "Macrozona Centro Sur",
  codigo_region %in% c(9, 14, 10) ~ "Macrozona Sur",
  codigo_region %in% c(11, 12) ~ "Macrozona Austral",
  TRUE ~ "RM"  # En caso de que algún código no esté especificado
)) %>% 
  janitor::tabyl(macrozona, clus_om9) 

janitor::chisq.test(tabla_cluster_macrozona_om9)
#X-squared = 173.09, df = 40, p-value < 2.2e-16

janitor::fisher.test(tabla_cluster_macrozona_om9, simulate.p.value=T, B=1e5)
#p-value = 1e-05

tabla_cluster_macrozona_om9%>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2) %>% 
  dplyr::mutate_at(2:10,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. macrozona")

    Pearson's Chi-squared test

data:  tabla_cluster_macrozona_om9
X-squared = 173.09, df = 40, p-value < 2.2e-16


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  tabla_cluster_macrozona_om9
p-value = 1e-05
alternative hypothesis: two.sided
Porcentajes por columna, conglomerado vs. macrozona
macrozona Un evento, TSM(1) Un evento, TUS(4) Un evento TSM larga duración(3) TSM, 1 año después, TSM(5) Un evento, comorbilidad(6) TSM, 2 años después, TSM(7) TSM, 2 años y medio después, TSM(8) Ingresa por TSM, después, otras causas constantemente(9) TSM, después, TSM constantemente(2)
Macrozona Austral 3% 4% 4% 4% 4% 7% 4% 19% 7%
Macrozona Centro 10% 13% 11% 5% 6% 11% 14% 6% 27%
Macrozona Centro Sur 20% 17% 18% 18% 16% 19% 21% 19% 20%
Macrozona Norte 9% 4% 6% 7% 3% 7% 9% 6% 20%
Macrozona Sur 14% 27% 13% 15% 14% 13% 19% 6% 0%
RM 45% 35% 48% 51% 57% 43% 35% 44% 27%

Tiempo que demora esta sección: 0 minutos

Code
#p-value = 1e-05
tab_clus_macrozona_om9<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
dplyr::mutate(macrozona = dplyr::case_when(
  codigo_region %in% c(15, 1, 2, 3) ~ "Macrozona Norte",
  codigo_region %in% c(4, 5)~ "Macrozona Centro",
  codigo_region %in% c(6, 7, 16, 8) ~ "Macrozona Centro Sur",
  codigo_region %in% c(9, 14, 10) ~ "Macrozona Sur",
  codigo_region %in% c(11, 12) ~ "Macrozona Austral",
  TRUE ~ "RM"  # En caso de que algún código no esté especificado
)) %>% 
  janitor::tabyl(macrozona, clus_om9)

pre_tab_clus_macrozona_om9<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
dplyr::mutate(macrozona = dplyr::case_when(
  codigo_region %in% c(15, 1, 2, 3) ~ "Macrozona Norte",
  codigo_region %in% c(4, 5)~ "Macrozona Centro",
  codigo_region %in% c(6, 7, 16, 8) ~ "Macrozona Centro Sur",
  codigo_region %in% c(9, 14, 10) ~ "Macrozona Sur",
  codigo_region %in% c(11, 12) ~ "Macrozona Austral",
  TRUE ~ "RM"  # En caso de que algún código no esté especificado
))

chisq.posthoc.test(tab_clus_macrozona_om9[-1]) %>% 
  dplyr::mutate_at(3:11, ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
  #knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")%>%
  group_by(Dimension) %>%
  summarise(across(starts_with("Un evento") | starts_with("TSM") | starts_with("Ingresa"), 
                   ~ paste0(first(sprintf("%1.2f",.)), " (p=", last(sprintf("%1.3f",.)), ")"))) %>%
  dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=0.000)","p<0.001)",.)) %>% 
  #dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=1)","p=1.000)",.)) %>% 
  dplyr::mutate(Dimension= tab_clus_macrozona_om9[1]) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-región")
Comparación post-hoc, conglomerado-región
Dimension Un evento, TSM(1) Un evento, TUS(4) Un evento TSM larga duración(3) Un evento, comorbilidad(6) TSM, 1 año después, TSM(5) TSM, 2 años después, TSM(7) TSM, 2 años y medio después, TSM(8) TSM, después, TSM constantemente(2) Ingresa por TSM, después, otras causas constantemente(9)
Macrozona Austral -2.23 (p=1.000) 0.79 (p=1.000) 0.52 (p=1.000) 0.29 (p=1.000) 0.07 (p=1.000) 2.29 (p=1.000) 0.12 (p=1.000) 0.68 (p=1.000) 3.35 (p=0.044)
Macrozona Centro -1.29 (p=1.000) 3.15 (p=0.087) 0.71 (p=1.000) -2.04 (p=1.000) -2.57 (p=0.548) 0.48 (p=1.000) 1.13 (p=1.000) 2.18 (p=1.000) -0.49 (p=1.000)
Macrozona Centro Sur 2.47 (p=0.722) -1.97 (p=1.000) -0.75 (p=1.000) -1.25 (p=1.000) -0.58 (p=1.000) -0.10 (p=1.000) 0.31 (p=1.000) 0.04 (p=1.000) -0.09 (p=1.000)
Macrozona Norte 4.29 (p=0.001) -3.81 (p=0.007) -1.07 (p=1.000) -2.65 (p=0.440) -0.33 (p=1.000) -0.35 (p=1.000) 0.34 (p=1.000) 1.80 (p=1.000) -0.21 (p=1.000)
Macrozona Sur -5.12 (p<0.001) 8.85 (p<0.001) -1.32 (p=1.000) -0.30 (p=1.000) -0.02 (p=1.000) -0.68 (p=1.000) 0.87 (p=1.000) -1.64 (p=1.000) -0.99 (p=1.000)
RM 1.01 (p=1.000) -4.95 (p<0.001) 1.51 (p=1.000) 3.75 (p=0.010) 2.17 (p=1.000) -0.38 (p=1.000) -1.77 (p=1.000) -1.38 (p=1.000) -0.04 (p=1.000)

Tiempo que demora esta sección: 0 minutos

Code
PT = rcompanion::pairwiseNominalIndependence( table(pre_tab_clus_macrozona_om9$clus_om9,pre_tab_clus_macrozona_om9$macrozona),
                                 fisher = TRUE,
                                 gtest  = FALSE,
                                 chisq  = FALSE,
                                 digits = 3, 
                                 simulate.p.value=T,
                                 B=1e4)

PT

rcompanion::cldList(comparison = PT$Comparison,
        p.value    = PT$p.adj.Fisher,
        threshold  = 0.05)
#Groups sharing a letter are not significantlt different (alpha = 0.05)
                                                                                       Comparison
1                                                           Un evento, TSM(1) : Un evento, TUS(4)
2                                             Un evento, TSM(1) : Un evento TSM larga duración(3)
3                                                  Un evento, TSM(1) : TSM, 1 año después, TSM(5)
4                                                  Un evento, TSM(1) : Un evento, comorbilidad(6)
5                                                 Un evento, TSM(1) : TSM, 2 años después, TSM(7)
6                                         Un evento, TSM(1) : TSM, 2 años y medio después, TSM(8)
7                    Un evento, TSM(1) : Ingresa por TSM, después, otras causas constantemente(9)
8                                         Un evento, TSM(1) : TSM, después, TSM constantemente(2)
9                                             Un evento, TUS(4) : Un evento TSM larga duración(3)
10                                                 Un evento, TUS(4) : TSM, 1 año después, TSM(5)
11                                                 Un evento, TUS(4) : Un evento, comorbilidad(6)
12                                                Un evento, TUS(4) : TSM, 2 años después, TSM(7)
13                                        Un evento, TUS(4) : TSM, 2 años y medio después, TSM(8)
14                   Un evento, TUS(4) : Ingresa por TSM, después, otras causas constantemente(9)
15                                        Un evento, TUS(4) : TSM, después, TSM constantemente(2)
16                                   Un evento TSM larga duración(3) : TSM, 1 año después, TSM(5)
17                                   Un evento TSM larga duración(3) : Un evento, comorbilidad(6)
18                                  Un evento TSM larga duración(3) : TSM, 2 años después, TSM(7)
19                          Un evento TSM larga duración(3) : TSM, 2 años y medio después, TSM(8)
20     Un evento TSM larga duración(3) : Ingresa por TSM, después, otras causas constantemente(9)
21                          Un evento TSM larga duración(3) : TSM, después, TSM constantemente(2)
22                                        TSM, 1 año después, TSM(5) : Un evento, comorbilidad(6)
23                                       TSM, 1 año después, TSM(5) : TSM, 2 años después, TSM(7)
24                               TSM, 1 año después, TSM(5) : TSM, 2 años y medio después, TSM(8)
25          TSM, 1 año después, TSM(5) : Ingresa por TSM, después, otras causas constantemente(9)
26                               TSM, 1 año después, TSM(5) : TSM, después, TSM constantemente(2)
27                                       Un evento, comorbilidad(6) : TSM, 2 años después, TSM(7)
28                               Un evento, comorbilidad(6) : TSM, 2 años y medio después, TSM(8)
29          Un evento, comorbilidad(6) : Ingresa por TSM, después, otras causas constantemente(9)
30                               Un evento, comorbilidad(6) : TSM, después, TSM constantemente(2)
31                              TSM, 2 años después, TSM(7) : TSM, 2 años y medio después, TSM(8)
32         TSM, 2 años después, TSM(7) : Ingresa por TSM, después, otras causas constantemente(9)
33                              TSM, 2 años después, TSM(7) : TSM, después, TSM constantemente(2)
34 TSM, 2 años y medio después, TSM(8) : Ingresa por TSM, después, otras causas constantemente(9)
35                      TSM, 2 años y medio después, TSM(8) : TSM, después, TSM constantemente(2)
36 Ingresa por TSM, después, otras causas constantemente(9) : TSM, después, TSM constantemente(2)
   p.Fisher p.adj.Fisher
1    0.0001      0.00090
2    0.3450      0.41400
3    0.0973      0.19900
4    0.0011      0.00660
5    0.2740      0.36400
6    0.3760      0.42300
7    0.1120      0.20200
8    0.0295      0.08850
9    0.0001      0.00090
10   0.0001      0.00090
11   0.0001      0.00090
12   0.0046      0.01880
13   0.2930      0.36400
14   0.0470      0.12100
15   0.0053      0.01910
16   0.2000      0.30000
17   0.1020      0.19900
18   0.7380      0.73800
19   0.2840      0.36400
20   0.2460      0.35400
21   0.0292      0.08850
22   0.4300      0.46900
23   0.1470      0.25200
24   0.0563      0.13500
25   0.1690      0.26900
26   0.0039      0.01880
27   0.0380      0.10500
28   0.0047      0.01880
29   0.1050      0.19900
30   0.0007      0.00504
31   0.6450      0.68300
32   0.6980      0.71800
33   0.1000      0.19900
34   0.2830      0.36400
35   0.1720      0.26900
36   0.3740      0.42300
                                               Group Letter MonoLetter
1                                    Unevento,TSM(1)     ab       ab  
2                                    Unevento,TUS(4)      c         c 
3                        UneventoTSMlargaduración(3)    abd       ab d
4                             TSM,1añodespués,TSM(5)     ad       a  d
5                           Unevento,comorbilidad(6)      d          d
6                            TSM,2añosdespués,TSM(7)    abd       ab d
7                      TSM,2añosymediodespués,TSM(8)    abc       abc 
8 IngresaporTSM,después,otrascausasconstantemente(9)   abcd       abcd
9                   TSM,después,TSMconstantemente(2)      b        b  

Tiempo que demora esta sección: 0 minutos

1.1.3.f. Comparación covariables- Sexo
Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    janitor::tabyl(clus_om9, glosa_sexo)%>% 
    janitor::chisq.test()
#X-squared = 246.11, df = 8, p-value < 2.2e-16

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  janitor::tabyl(clus_om9, glosa_sexo)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 2) %>% 
  dplyr::mutate_at(2:3,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. sexo")

    Pearson's Chi-squared test

data:  .
X-squared = 246.11, df = 8, p-value < 2.2e-16
Porcentajes por columna, conglomerado vs. sexo
clus_om9 HOMBRE MUJER
Un evento, TSM(1) 42% 58.0%
Un evento, TUS(4) 70% 30.0%
Un evento TSM larga duración(3) 38% 62.0%
TSM, 1 año después, TSM(5) 41% 59.0%
Un evento, comorbilidad(6) 69% 31.0%
TSM, 2 años después, TSM(7) 43% 57.0%
TSM, 2 años y medio después, TSM(8) 38% 62.0%
Ingresa por TSM, después, otras causas constantemente(9) 44% 56.0%
TSM, después, TSM constantemente(2) 40% 60.0%

Tiempo que demora esta sección: 0 minutos

Code
chisq.posthoc.test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_om9,ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$glosa_sexo))%>% 
    pivot_longer(cols = c(`HOMBRE`, `MUJER`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group=="MUJER") %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", as.numeric(Residuals))) %>% 
    dplyr::mutate( `p values`= sprintf("%1.3f", as.numeric(gsub("\\*","",`p values`)))) %>% 
    select(Code, Evento, Residuals, `p values`) %>% 
  dplyr::mutate(`p values`= ifelse(`p values`=="0.000","<0.001",`p values`)) %>% 
  knitr::kable("markdown", col.names=c("Código","Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. sexo")
Post-hoc, conglomerado vs. sexo
Código Descripción Residuos Sig.
Un evento, TSM(1) 9.55 <0.001
Un evento, TUS(4) -13.55 <0.001
Un evento TSM larga duración(3) 2.82 0.087
TSM, 1 año después, TSM(5) 1.56 1.000
Un evento, comorbilidad(6) -6.83 <0.001
TSM, 2 años después, TSM(7) 0.74 1.000
TSM, 2 años y medio después, TSM(8) 1.36 1.000
Ingresa por TSM, después, otras causas constantemente(9) 0.16 1.000
TSM, después, TSM constantemente(2) 0.45 1.000

Tiempo que demora esta sección: 0 minutos

1.1.3.g. Comparación covariables- Edad
Code
dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
  dplyr::filter(quarter == 0) %>%
  dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_om9")], by="run") %>%
  dplyr::group_by(clus_om9) %>%
  dplyr::summarise(mean_edad = mean(min_edad_anos),
                   sd= sd(min_edad_anos),
                   ci_lower = mean(min_edad_anos) - qt(0.975, n()-1) * sd(min_edad_anos)/sqrt(n()),
                   ci_upper = mean(min_edad_anos) + qt(0.975, n()-1) * sd(min_edad_anos)/sqrt(n())) %>% # Plot con ggplot2
ggplot(aes(x = clus_om9, y = mean_edad)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "Edad promedio") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/edad_minima_por_cluster_om9.png", dpi=600)
Edad promedio primer ingreso con intervalo de confianza por conglomerado

Edad promedio primer ingreso con intervalo de confianza por conglomerado

Tiempo que demora esta sección: 0.1 minutos

Code
invisible("Prueba de Levene par igualdad de varianzas")
with(dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
               dplyr::filter(quarter == 0) %>%
               dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_om9")], by="run"), car::leveneTest(min_edad_anos, clus_om9))

anova_om9 <- oneway.test(min_edad_anos ~ clus_om9, 
             data = dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
               dplyr::filter(quarter == 0) %>%
               dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_om9")], by="run"),var.equal = T)

# Ver los resultados del ANOVA
print(anova_om9)
#F = 19.882, num df = 8, denom df = 6029, p-value < 2.2e-16
Levene's Test for Homogeneity of Variance (center = median)
        Df F value Pr(>F)
group    8  1.3965 0.1924
      6029               

    One-way analysis of means

data:  min_edad_anos and clus_om9
F = 19.882, num df = 8, denom df = 6029, p-value < 2.2e-16

Tiempo que demora esta sección: 0 minutos

1.1.3.h. Comparación covariables- Previsión
Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    janitor::tabyl(clus_om9, prev_benef_rec_post)%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }
#X-squared = 55.738, df = 32, p-value = 0.00579
#p-value = 0.00299 Fisher

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  janitor::tabyl(clus_om9, prev_benef_rec_post)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate_at(2:6,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. Beneficios")

    Pearson's Chi-squared test

data:  .
X-squared = 55.738, df = 32, p-value = 0.00579


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.0032
alternative hypothesis: two.sided
Porcentajes por columna, conglomerado vs. Beneficios
clus_om9 FFAA FONASA A FONASA BC FONASA D ISAPRE
Un evento, TSM(1) 4.3% 26.8% 32.1% 11.70% 25.1%
Un evento, TUS(4) 1.9% 28.2% 31.9% 14.50% 23.6%
Un evento TSM larga duración(3) 4.0% 29.1% 32.1% 9.50% 25.4%
TSM, 1 año después, TSM(5) 3.5% 26.5% 31.4% 8.40% 30.1%
Un evento, comorbilidad(6) 1.4% 27.3% 38.8% 12.40% 20.1%
TSM, 2 años después, TSM(7) 3.4% 15.2% 37.2% 15.90% 28.3%
TSM, 2 años y medio después, TSM(8) 1.2% 23.5% 39.5% 14.80% 21.0%
Ingresa por TSM, después, otras causas constantemente(9) 0.0% 31.2% 43.8% 12.50% 12.5%
TSM, después, TSM constantemente(2) 0.0% 53.3% 26.7% 20.00% 0.0%

Tiempo que demora esta sección: 0 minutos

Code
base_tabla_cluster_om9_benef_fonasa_a<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>%
  dplyr::mutate(prev_benef_rec_post_a = ifelse(prev_benef_rec_post== "FONASA A",1,0))


chisq.posthoc.test(table(base_tabla_cluster_om9_benef_fonasa_a$prev_benef_rec_post, 
                         base_tabla_cluster_om9_benef_fonasa_a$clus_om9)) %>% 
  dplyr::mutate_at(3:11, ~round(as.numeric(gsub("\\*","",.)),2)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-previsión")
Comparación post-hoc, conglomerado-previsión
Dimension Value Un evento, TSM(1) Un evento, TUS(4) Un evento TSM larga duración(3) TSM, 1 año después, TSM(5) Un evento, comorbilidad(6) TSM, 2 años después, TSM(7) TSM, 2 años y medio después, TSM(8) Ingresa por TSM, después, otras causas constantemente(9) TSM, después, TSM constantemente(2)
FFAA Residuals 3.24 -2.73 0.16 -0.22 -1.82 -0.23 -1.22 -0.80 -0.77
FFAA p values 0.05 0.28 1.00 1.00 1.00 1.00 1.00 1.00 1.00
FONASA A Residuals -0.11 0.84 0.93 -0.10 0.15 -3.21 -0.69 0.40 2.32
FONASA A p values 1.00 1.00 1.00 1.00 1.00 0.06 1.00 1.00 0.92
FONASA BC Residuals -1.12 -0.38 -0.16 -0.36 1.96 1.23 1.35 0.96 -0.48
FONASA BC p values 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
FONASA D Residuals -1.00 2.14 -1.41 -1.67 0.23 1.47 0.80 0.07 0.96
FONASA D p values 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
ISAPRE Residuals 0.64 -0.84 0.20 1.84 -1.64 0.95 -0.82 -1.15 -2.23
ISAPRE p values 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00

Tiempo que demora esta sección: 0 minutos

1.1.3.h.a. FONASA A vs. otros
Code
base_tabla_cluster_om9_benef_fonasa_a %>% 
    janitor::tabyl(clus_om9, prev_benef_rec_post_a)%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }

Warning in stats::chisq.test(., …): Chi-squared approximation may be incorrect


    Pearson's Chi-squared test

data:  .
X-squared = 17.51, df = 8, p-value = 0.02521


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.01968
alternative hypothesis: two.sided
Code
#X-squared = 17.51, df = 8, p-value = 0.02521
#p-value = 0.01969

base_tabla_cluster_om9_benef_fonasa_a %>% 
  janitor::tabyl(clus_om9, prev_benef_rec_post_a)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate_at(2:3,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)", col.names= c("Conglomerado", "Resto", "FONASA A"))
Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)
Conglomerado Resto FONASA A
Un evento, TSM(1) 73.2% 26.8%
Un evento, TUS(4) 71.8% 28.2%
Un evento TSM larga duración(3) 70.9% 29.1%
TSM, 1 año después, TSM(5) 73.5% 26.5%
Un evento, comorbilidad(6) 72.7% 27.3%
TSM, 2 años después, TSM(7) 84.8% 15.2%
TSM, 2 años y medio después, TSM(8) 76.5% 23.5%
Ingresa por TSM, después, otras causas constantemente(9) 68.8% 31.2%
TSM, después, TSM constantemente(2) 46.7% 53.3%

Tiempo que demora esta sección: 0 minutos

Code
chisq.posthoc.test(table(base_tabla_cluster_om9_benef_fonasa_a$prev_benef_rec_post_a, 
                         base_tabla_cluster_om9_benef_fonasa_a$clus_om9)) %>% 
  dplyr::mutate_at(3:11, ~round(as.numeric(gsub("\\*","",.)),2)) %>% 
  dplyr::filter(Dimension==1) %>% 
  dplyr::select(-Dimension) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-previsión (FONASA A)")
Comparación post-hoc, conglomerado-previsión (FONASA A)
Value Un evento, TSM(1) Un evento, TUS(4) Un evento TSM larga duración(3) TSM, 1 año después, TSM(5) Un evento, comorbilidad(6) TSM, 2 años después, TSM(7) TSM, 2 años y medio después, TSM(8) Ingresa por TSM, después, otras causas constantemente(9) TSM, después, TSM constantemente(2)
Residuals -0.11 0.84 0.93 -0.1 0.15 -3.21 -0.69 0.4 2.32
p values 1.00 1.00 1.00 1.0 1.00 0.02 1.00 1.0 0.37

Tiempo que demora esta sección: 0 minutos

1.1.3.h.b. ISAPRE vs. otros
Code
base_tabla_cluster_om9_benef_isapre<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>%
  dplyr::mutate(prev_benef_rec_post_a = ifelse(prev_benef_rec_post== "ISAPRE",1,0))


base_tabla_cluster_om9_benef_isapre %>% 
    janitor::tabyl(clus_om9, prev_benef_rec_post_a)%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }

Warning in stats::chisq.test(., …): Chi-squared approximation may be incorrect


    Pearson's Chi-squared test

data:  .
X-squared = 14.445, df = 8, p-value = 0.07088


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.05762
alternative hypothesis: two.sided
Code
#X-squared = 14.445, df = 8, p-value = 0.07088
#p-value = 0.05895

base_tabla_cluster_om9_benef_isapre %>% 
  janitor::tabyl(clus_om9, prev_benef_rec_post_a)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate_at(2:3,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)", col.names= c("Conglomerado", "Resto", "ISAPRE"))
Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)
Conglomerado Resto ISAPRE
Un evento, TSM(1) 74.9% 25.1%
Un evento, TUS(4) 76.4% 23.6%
Un evento TSM larga duración(3) 74.6% 25.4%
TSM, 1 año después, TSM(5) 69.9% 30.1%
Un evento, comorbilidad(6) 79.9% 20.1%
TSM, 2 años después, TSM(7) 71.7% 28.3%
TSM, 2 años y medio después, TSM(8) 79.0% 21.0%
Ingresa por TSM, después, otras causas constantemente(9) 87.5% 12.5%
TSM, después, TSM constantemente(2) 100.0% 0.0%

Tiempo que demora esta sección: 0 minutos

Code
chisq.posthoc.test(table(base_tabla_cluster_om9_benef_isapre$prev_benef_rec_post_a, 
                         base_tabla_cluster_om9_benef_isapre$clus_om9)) %>% 
  dplyr::mutate_at(3:11, ~round(as.numeric(gsub("\\*","",.)),2)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-previsión (ISAPRE)")
Comparación post-hoc, conglomerado-previsión (ISAPRE)
Dimension Value Un evento, TSM(1) Un evento, TUS(4) Un evento TSM larga duración(3) TSM, 1 año después, TSM(5) Un evento, comorbilidad(6) TSM, 2 años después, TSM(7) TSM, 2 años y medio después, TSM(8) Ingresa por TSM, después, otras causas constantemente(9) TSM, después, TSM constantemente(2)
0 Residuals -0.64 0.84 -0.2 -1.84 1.64 -0.95 0.82 1.15 2.23
0 p values 1.00 1.00 1.0 1.00 1.00 1.00 1.00 1.00 0.46
1 Residuals 0.64 -0.84 0.2 1.84 -1.64 0.95 -0.82 -1.15 -2.23
1 p values 1.00 1.00 1.0 1.00 1.00 1.00 1.00 1.00 0.46

Tiempo que demora esta sección: 0 minutos

1.1.3.i. Comparación covariables- Niv. Complejidad
Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(nivel_de_complejidad, clus_om9) %>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2) %>% 
   dplyr::mutate_at(2:10, ~scales::percent(as.numeric(.), accuracy=.1)) %>% 
  knitr::kable(caption="Tabla de contingencia, Niv. de complejidad (proporción por columna)")
Tabla de contingencia, Niv. de complejidad (proporción por columna)
nivel_de_complejidad Un evento, TSM(1) Un evento, TUS(4) Un evento TSM larga duración(3) TSM, 1 año después, TSM(5) Un evento, comorbilidad(6) TSM, 2 años después, TSM(7) TSM, 2 años y medio después, TSM(8) Ingresa por TSM, después, otras causas constantemente(9) TSM, después, TSM constantemente(2)
Alta Complejidad 62.0% 68.0% 52.0% 59.0% 74.0% 63.0% 47.0% 69.0% 60.0%
Baja Complejidad 16.0% 19.0% 17.0% 12.0% 9.0% 10.0% 21.0% 25.0% 13.0%
Mediana Complejidad 19.0% 12.0% 26.0% 22.0% 16.0% 22.0% 27.0% 6.0% 27.0%
Pendiente 2.0% 1.0% 5.0% 6.0% 0.0% 5.0% 5.0% 0.0% 0.0%
Sin dato 1.0% 1.0% 1.0% 1.0% 0.0% 0.0% 0.0% 0.0% 0.0%

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(nivel_de_complejidad, clus_om9) %>% 
  janitor::fisher.test(simulate.p.value=T, B=1e5)
#p-value = 1e-05

tabla_cluster_complejidad_om9<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                  by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first")

chisq.posthoc.test(
  table(tabla_cluster_complejidad_om9$nivel_de_complejidad, tabla_cluster_complejidad_om9$clus_om9)) %>% 
  dplyr::mutate_at(3:11, ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-Niv. complejidad")

    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 1e-05
alternative hypothesis: two.sided
Comparación post-hoc, conglomerado-Niv. complejidad
Dimension Value Un evento, TSM(1) Un evento, TUS(4) Un evento TSM larga duración(3) TSM, 1 año después, TSM(5) Un evento, comorbilidad(6) TSM, 2 años después, TSM(7) TSM, 2 años y medio después, TSM(8) Ingresa por TSM, después, otras causas constantemente(9) TSM, después, TSM constantemente(2)
Alta Complejidad Residuals -1.037 3.436 -3.818 -0.841 3.699 0.201 -2.808 0.560 -0.156
Alta Complejidad p values 1.000 0.026 0.006 1.000 0.010 1.000 0.224 1.000 1.000
Baja Complejidad Residuals 0.866 1.777 0.151 -1.774 -2.844 -1.941 1.174 0.955 -0.303
Baja Complejidad p values 1.000 1.000 1.000 1.000 0.201 1.000 1.000 1.000 1.000
Mediana Complejidad Residuals 0.899 -5.065 3.416 1.298 -0.959 1.015 1.935 -1.288 0.779
Mediana Complejidad p values 1.000 0.000 0.029 1.000 1.000 1.000 1.000 1.000 1.000
Pendiente Residuals -1.324 -2.883 3.212 3.525 -1.789 2.053 1.593 -0.615 -0.595
Pendiente p values 1.000 0.177 0.059 0.019 1.000 1.000 1.000 1.000 1.000
Sin dato Residuals 0.370 1.053 -0.222 0.315 -1.246 -1.032 -0.767 -0.339 -0.328
Sin dato p values 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000

Tiempo que demora esta sección: 0 minutos

1.1.3.j. Comparación covariables- Tratamientos
Code
#Definimos la base de datos que agrupa por observación y nos permite unirla con nuestros cluster
dias_ttos_base<-
data_long_establecimiento_2024_std %>% 
  dplyr::group_by(run) %>% 
  dplyr::mutate(diff_tr=fecha_ingreso_rec_fmt-lag(fecha_egreso_rec_fmt)) %>% 
  dplyr::ungroup() %>% 
  dplyr::group_by(run) %>% 
  dplyr::summarise(n_ttos=n(), promedio_dias=mean(days_elapsed), promedio_diff_tr=mean(diff_tr,na.rm=T))

table(as.numeric(dias_ttos_base$promedio_diff_tr)<0)
invisible("20 menores a 0")

dias_ttos_base$promedio_diff_tr<-ifelse(dias_ttos_base$promedio_diff_tr<0,-dias_ttos_base$promedio_diff_tr, dias_ttos_base$promedio_diff_tr)

invisible("Prueba de Levene par igualdad de varianzas")
with(dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, dias_ttos_base,  by = c("run" = "run"), multiple = "first"), car::leveneTest(n_ttos, clus_om9))
#group    8  61.511 < 2.2e-16 ***

# Realizar el ANOVA comparando la edad media entre los diferentes conglomerados (clus_pam)
anova_n_ttos_om9 <-oneway.test(n_ttos ~ clus_om9, 
data = ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>%
                             dplyr::inner_join(dias_ttos_base, 
      by = c("run" = "run"), multiple = "first"), var.equal = F)
# Ver los resultados del ANOVA
print(anova_n_ttos_om9)
#F = 75.483, num df = 8.00, denom df = 156.42, p-value < 2.2e-16


rstatix::games_howell_test(n_ttos ~ clus_om9, 
  data =ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>%
    dplyr::inner_join(dias_ttos_base, by = c("run" = "run"), multiple = "first")) %>% 
    dplyr::select(-1) %>% 
    dplyr::mutate(
    summary = sprintf(
      "%.2f [%.2f, %.2f], p= %s",
      as.numeric(estimate), 
      as.numeric(conf.low), 
      as.numeric(conf.high), 
      ifelse(p.adj < 0.001, "<0.001", sprintf("%.3f", p.adj)))) %>% 
  dplyr::select(!any_of(c("estimate","conf.low", "conf.high", "p.adj", "p.adj.signif"))) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado1","Conglomerado2", "Estimación"), caption="Post-hoc, conglomerado vs. N°s días de tratamiento")

FALSE  TRUE 
 2787    20 
Levene's Test for Homogeneity of Variance (center = median)
        Df F value    Pr(>F)    
group    8  61.511 < 2.2e-16 ***
      6029                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    One-way analysis of means (not assuming equal variances)

data:  n_ttos and clus_om9
F = 75.483, num df = 8.00, denom df = 156.42, p-value < 2.2e-16
Post-hoc, conglomerado vs. N°s días de tratamiento
Conglomerado1 Conglomerado2 Estimación
Un evento, TSM(1) Un evento, TUS(4) 0.09 [-0.08, 0.27], p= 0.781
Un evento, TSM(1) Un evento TSM larga duración(3) 1.64 [1.20, 2.08], p= <0.001
Un evento, TSM(1) TSM, 1 año después, TSM(5) 2.32 [1.68, 2.95], p= <0.001
Un evento, TSM(1) Un evento, comorbilidad(6) 0.56 [0.19, 0.93], p= <0.001
Un evento, TSM(1) TSM, 2 años después, TSM(7) 1.62 [1.24, 2.00], p= <0.001
Un evento, TSM(1) TSM, 2 años y medio después, TSM(8) 3.28 [2.09, 4.47], p= <0.001
Un evento, TSM(1) Ingresa por TSM, después, otras causas constantemente(9) 7.36 [4.31, 10.42], p= <0.001
Un evento, TSM(1) TSM, después, TSM constantemente(2) 7.43 [1.06, 13.80], p= 0.017
Un evento, TUS(4) Un evento TSM larga duración(3) 1.55 [1.08, 2.02], p= <0.001
Un evento, TUS(4) TSM, 1 año después, TSM(5) 2.22 [1.57, 2.87], p= <0.001
Un evento, TUS(4) Un evento, comorbilidad(6) 0.47 [0.07, 0.87], p= 0.009
Un evento, TUS(4) TSM, 2 años después, TSM(7) 1.53 [1.12, 1.93], p= <0.001
Un evento, TUS(4) TSM, 2 años y medio después, TSM(8) 3.18 [1.98, 4.39], p= <0.001
Un evento, TUS(4) Ingresa por TSM, después, otras causas constantemente(9) 7.27 [4.21, 10.33], p= <0.001
Un evento, TUS(4) TSM, después, TSM constantemente(2) 7.34 [0.97, 13.71], p= 0.019
Un evento TSM larga duración(3) TSM, 1 año después, TSM(5) 0.67 [-0.09, 1.44], p= 0.133
Un evento TSM larga duración(3) Un evento, comorbilidad(6) -1.08 [-1.65, -0.52], p= <0.001
Un evento TSM larga duración(3) TSM, 2 años después, TSM(7) -0.02 [-0.59, 0.55], p= 1.000
Un evento TSM larga duración(3) TSM, 2 años y medio después, TSM(8) 1.64 [0.37, 2.90], p= 0.003
Un evento TSM larga duración(3) Ingresa por TSM, después, otras causas constantemente(9) 5.72 [2.65, 8.80], p= <0.001
Un evento TSM larga duración(3) TSM, después, TSM constantemente(2) 5.79 [-0.59, 12.16], p= 0.089
TSM, 1 año después, TSM(5) Un evento, comorbilidad(6) -1.76 [-2.48, -1.03], p= <0.001
TSM, 1 año después, TSM(5) TSM, 2 años después, TSM(7) -0.70 [-1.42, 0.03], p= 0.073
TSM, 1 año después, TSM(5) TSM, 2 años y medio después, TSM(8) 0.96 [-0.38, 2.30], p= 0.369
TSM, 1 año después, TSM(5) Ingresa por TSM, después, otras causas constantemente(9) 5.05 [1.95, 8.14], p= <0.001
TSM, 1 año después, TSM(5) TSM, después, TSM constantemente(2) 5.12 [-1.27, 11.50], p= 0.169
Un evento, comorbilidad(6) TSM, 2 años después, TSM(7) 1.06 [0.54, 1.58], p= <0.001
Un evento, comorbilidad(6) TSM, 2 años y medio después, TSM(8) 2.72 [1.48, 3.96], p= <0.001
Un evento, comorbilidad(6) Ingresa por TSM, después, otras causas constantemente(9) 6.80 [3.74, 9.87], p= <0.001
Un evento, comorbilidad(6) TSM, después, TSM constantemente(2) 6.87 [0.50, 13.24], p= 0.030
TSM, 2 años después, TSM(7) TSM, 2 años y medio después, TSM(8) 1.66 [0.41, 2.90], p= 0.002
TSM, 2 años después, TSM(7) Ingresa por TSM, después, otras causas constantemente(9) 5.74 [2.68, 8.81], p= <0.001
TSM, 2 años después, TSM(7) TSM, después, TSM constantemente(2) 5.81 [-0.56, 12.18], p= 0.087
TSM, 2 años y medio después, TSM(8) Ingresa por TSM, después, otras causas constantemente(9) 4.09 [0.89, 7.29], p= 0.006
TSM, 2 años y medio después, TSM(8) TSM, después, TSM constantemente(2) 4.15 [-2.27, 10.58], p= 0.390
Ingresa por TSM, después, otras causas constantemente(9) TSM, después, TSM constantemente(2) 0.07 [-6.67, 6.81], p= 1.000

Tiempo que demora esta sección: 0.1 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(dias_ttos_base, 
                    by = c("run" = "run"), multiple = "first")  %>%
  dplyr::group_by(clus_om9) %>%
  dplyr::summarise(mean_n_ttos = mean(n_ttos),
                   sd= sd(n_ttos),
                   ci_lower = mean(n_ttos) - qt(0.975, n()-1) * sd(n_ttos)/sqrt(n()),
                   ci_upper = mean(n_ttos) + qt(0.975, n()-1) * sd(n_ttos)/sqrt(n())) %>% # Plot con ggplot2
  ggplot(aes(x = clus_om9, y = mean_n_ttos)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "N ttos promedio") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/n_ttos_por_cluster_om9.png", dpi=600)
Número de tratamientos (promedio y bigotes en IC95%)

Número de tratamientos (promedio y bigotes en IC95%)

Tiempo que demora esta sección: 0.1 minutos

1.1.3.k. Comparación covariables- Días promedio
Code
rstatix::games_howell_test(promedio_dias ~ clus_om9, 
  data =ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>%
    dplyr::inner_join(dias_ttos_base, by = c("run" = "run"), multiple = "first")) %>% 
    dplyr::select(-1) %>% 
    dplyr::mutate(
    summary = sprintf(
      "%.2f [%.2f, %.2f], p= %s",
      as.numeric(estimate), 
      as.numeric(conf.low), 
      as.numeric(conf.high), 
      ifelse(p.adj < 0.001, "<0.001", sprintf("%.3f", p.adj)))) %>% 
  dplyr::select(!any_of(c("estimate","conf.low", "conf.high", "p.adj", "p.adj.signif"))) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado1","Conglomerado2", "Estimación"), caption="Post-hoc, conglomerado vs. Promedio días de tratamiento")
Post-hoc, conglomerado vs. Promedio días de tratamiento
Conglomerado1 Conglomerado2 Estimación
Un evento, TSM(1) Un evento, TUS(4) -2.10 [-4.44, 0.23], p= 0.117
Un evento, TSM(1) Un evento TSM larga duración(3) 16.23 [9.34, 23.11], p= <0.001
Un evento, TSM(1) TSM, 1 año después, TSM(5) 11.20 [3.55, 18.84], p= <0.001
Un evento, TSM(1) Un evento, comorbilidad(6) 15.01 [-2.47, 32.49], p= 0.157
Un evento, TSM(1) TSM, 2 años después, TSM(7) 7.13 [1.97, 12.29], p= <0.001
Un evento, TSM(1) TSM, 2 años y medio después, TSM(8) 11.90 [2.32, 21.48], p= 0.005
Un evento, TSM(1) Ingresa por TSM, después, otras causas constantemente(9) -1.63 [-10.13, 6.87], p= 0.998
Un evento, TSM(1) TSM, después, TSM constantemente(2) 150.37 [-83.97, 384.70], p= 0.388
Un evento, TUS(4) Un evento TSM larga duración(3) 18.33 [11.12, 25.54], p= <0.001
Un evento, TUS(4) TSM, 1 año después, TSM(5) 13.30 [5.36, 21.24], p= <0.001
Un evento, TUS(4) Un evento, comorbilidad(6) 17.11 [-0.50, 34.72], p= 0.064
Un evento, TUS(4) TSM, 2 años después, TSM(7) 9.23 [3.65, 14.81], p= <0.001
Un evento, TUS(4) TSM, 2 años y medio después, TSM(8) 14.00 [4.20, 23.80], p= <0.001
Un evento, TUS(4) Ingresa por TSM, después, otras causas constantemente(9) 0.47 [-8.20, 9.14], p= 1.000
Un evento, TUS(4) TSM, después, TSM constantemente(2) 152.47 [-81.87, 386.81], p= 0.372
Un evento TSM larga duración(3) TSM, 1 año después, TSM(5) -5.03 [-15.24, 5.18], p= 0.838
Un evento TSM larga duración(3) Un evento, comorbilidad(6) -1.22 [-19.95, 17.51], p= 1.000
Un evento TSM larga duración(3) TSM, 2 años después, TSM(7) -9.10 [-17.62, -0.59], p= 0.026
Un evento TSM larga duración(3) TSM, 2 años y medio después, TSM(8) -4.33 [-16.00, 7.34], p= 0.963
Un evento TSM larga duración(3) Ingresa por TSM, después, otras causas constantemente(9) -17.86 [-28.31, -7.40], p= <0.001
Un evento TSM larga duración(3) TSM, después, TSM constantemente(2) 134.14 [-100.25, 368.52], p= 0.523
TSM, 1 año después, TSM(5) Un evento, comorbilidad(6) 3.81 [-15.20, 22.82], p= 0.999
TSM, 1 año después, TSM(5) TSM, 2 años después, TSM(7) -4.07 [-13.21, 5.07], p= 0.901
TSM, 1 año después, TSM(5) TSM, 2 años y medio después, TSM(8) 0.70 [-11.41, 12.82], p= 1.000
TSM, 1 año después, TSM(5) Ingresa por TSM, después, otras causas constantemente(9) -12.83 [-23.75, -1.90], p= 0.010
TSM, 1 año después, TSM(5) TSM, después, TSM constantemente(2) 139.17 [-95.23, 373.56], p= 0.479
Un evento, comorbilidad(6) TSM, 2 años después, TSM(7) -7.88 [-26.05, 10.29], p= 0.912
Un evento, comorbilidad(6) TSM, 2 años y medio después, TSM(8) -3.11 [-22.89, 16.67], p= 1.000
Un evento, comorbilidad(6) Ingresa por TSM, después, otras causas constantemente(9) -16.64 [-35.62, 2.35], p= 0.138
Un evento, comorbilidad(6) TSM, después, TSM constantemente(2) 135.36 [-99.31, 370.02], p= 0.516
TSM, 2 años después, TSM(7) TSM, 2 años y medio después, TSM(8) 4.77 [-5.99, 15.54], p= 0.896
TSM, 2 años después, TSM(7) Ingresa por TSM, después, otras causas constantemente(9) -8.76 [-18.30, 0.78], p= 0.092
TSM, 2 años después, TSM(7) TSM, después, TSM constantemente(2) 143.24 [-91.12, 377.60], p= 0.445
TSM, 2 años y medio después, TSM(8) Ingresa por TSM, después, otras causas constantemente(9) -13.53 [-25.76, -1.30], p= 0.019
TSM, 2 años y medio después, TSM(8) TSM, después, TSM constantemente(2) 138.47 [-95.96, 372.89], p= 0.486
Ingresa por TSM, después, otras causas constantemente(9) TSM, después, TSM constantemente(2) 152.00 [-82.40, 386.39], p= 0.376

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(dias_ttos_base, 
                    by = c("run" = "run"), multiple = "first")  %>%
  dplyr::group_by(clus_om9) %>%
  dplyr::summarise(mean_promedio_dias = mean(promedio_dias),
                   sd= sd(promedio_dias),
                   ci_lower = mean(promedio_dias) - qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n()),
                   ci_upper = mean(promedio_dias) + qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n())) %>% # Plot con ggplot2
  ggplot(aes(x = clus_om9, y = mean_promedio_dias)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "Días en tratamiento") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/dias_en_tto_por_cluster_om9.png", dpi=600)
Días en tratamiento (promedio y bigotes en IC95%)

Días en tratamiento (promedio y bigotes en IC95%)

Tiempo que demora esta sección: 0.1 minutos

1.1.3.l. Comparación covariables- Días de diferencia
Code
rstatix::games_howell_test(promedio_diff_tr ~ clus_om9, 
  data =ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>%
    dplyr::inner_join(dias_ttos_base, by = c("run" = "run"), multiple = "first")) %>% 
    dplyr::select(-1) %>% 
    dplyr::mutate(
    summary = sprintf(
      "%.2f [%.2f, %.2f], p= %s",
      as.numeric(estimate), 
      as.numeric(conf.low), 
      as.numeric(conf.high), 
      ifelse(p.adj < 0.001, "<0.001", sprintf("%.3f", p.adj)))) %>% 
  dplyr::select(!any_of(c("estimate","conf.low", "conf.high", "p.adj", "p.adj.signif"))) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado1","Conglomerado2", "Estimación"), caption="Post-hoc, conglomerado vs. Promedio días de diferencia entre tratamientos")
Post-hoc, conglomerado vs. Promedio días de diferencia entre tratamientos
Conglomerado1 Conglomerado2 Estimación
Un evento, TSM(1) Un evento, TUS(4) 8.54 [-63.62, 80.71], p= 1.000
Un evento, TSM(1) Un evento TSM larga duración(3) -242.17 [-277.13, -207.21], p= <0.001
Un evento, TSM(1) TSM, 1 año después, TSM(5) -138.32 [-175.02, -101.62], p= <0.001
Un evento, TSM(1) Un evento, comorbilidad(6) -85.43 [-192.70, 21.84], p= 0.236
Un evento, TSM(1) TSM, 2 años después, TSM(7) 76.49 [11.01, 141.96], p= 0.009
Un evento, TSM(1) TSM, 2 años y medio después, TSM(8) 83.66 [-33.41, 200.72], p= 0.370
Un evento, TSM(1) Ingresa por TSM, después, otras causas constantemente(9) -247.39 [-306.62, -188.15], p= <0.001
Un evento, TSM(1) TSM, después, TSM constantemente(2) -289.52 [-359.22, -219.82], p= <0.001
Un evento, TUS(4) Un evento TSM larga duración(3) -250.71 [-321.02, -180.40], p= <0.001
Un evento, TUS(4) TSM, 1 año después, TSM(5) -146.86 [-218.03, -75.70], p= <0.001
Un evento, TUS(4) Un evento, comorbilidad(6) -93.98 [-216.82, 28.87], p= 0.291
Un evento, TUS(4) TSM, 2 años después, TSM(7) 67.94 [-21.18, 157.07], p= 0.299
Un evento, TUS(4) TSM, 2 años y medio después, TSM(8) 75.11 [-56.16, 206.38], p= 0.680
Un evento, TUS(4) Ingresa por TSM, después, otras causas constantemente(9) -255.93 [-339.04, -172.82], p= <0.001
Un evento, TUS(4) TSM, después, TSM constantemente(2) -298.06 [-387.81, -208.31], p= <0.001
Un evento TSM larga duración(3) TSM, 1 año después, TSM(5) 103.85 [70.97, 136.73], p= <0.001
Un evento TSM larga duración(3) Un evento, comorbilidad(6) 156.74 [50.68, 262.79], p= <0.001
Un evento TSM larga duración(3) TSM, 2 años después, TSM(7) 318.66 [255.22, 382.09], p= <0.001
Un evento TSM larga duración(3) TSM, 2 años y medio después, TSM(8) 325.82 [209.85, 441.80], p= <0.001
Un evento TSM larga duración(3) Ingresa por TSM, después, otras causas constantemente(9) -5.22 [-62.70, 52.26], p= 1.000
Un evento TSM larga duración(3) TSM, después, TSM constantemente(2) -47.35 [-115.76, 21.05], p= 0.324
TSM, 1 año después, TSM(5) Un evento, comorbilidad(6) 52.89 [-53.72, 159.50], p= 0.822
TSM, 1 año después, TSM(5) TSM, 2 años después, TSM(7) 214.81 [150.43, 279.19], p= <0.001
TSM, 1 año después, TSM(5) TSM, 2 años y medio después, TSM(8) 221.98 [105.50, 338.45], p= <0.001
TSM, 1 año después, TSM(5) Ingresa por TSM, después, otras causas constantemente(9) -109.07 [-167.35, -50.78], p= <0.001
TSM, 1 año después, TSM(5) TSM, después, TSM constantemente(2) -151.20 [-220.19, -82.21], p= <0.001
Un evento, comorbilidad(6) TSM, 2 años después, TSM(7) 161.92 [42.88, 280.96], p= 0.001
Un evento, comorbilidad(6) TSM, 2 años y medio después, TSM(8) 169.09 [16.60, 321.58], p= 0.018
Un evento, comorbilidad(6) Ingresa por TSM, después, otras causas constantemente(9) -161.96 [-276.28, -47.63], p= <0.001
Un evento, comorbilidad(6) TSM, después, TSM constantemente(2) -204.09 [-322.84, -85.33], p= <0.001
TSM, 2 años después, TSM(7) TSM, 2 años y medio después, TSM(8) 7.17 [-120.59, 134.93], p= 1.000
TSM, 2 años después, TSM(7) Ingresa por TSM, después, otras causas constantemente(9) -323.88 [-401.45, -246.30], p= <0.001
TSM, 2 años después, TSM(7) TSM, después, TSM constantemente(2) -366.01 [-450.83, -281.19], p= <0.001
TSM, 2 años y medio después, TSM(8) Ingresa por TSM, después, otras causas constantemente(9) -331.04 [-454.44, -207.64], p= <0.001
TSM, 2 años y medio después, TSM(8) TSM, después, TSM constantemente(2) -373.18 [-500.58, -245.77], p= <0.001
Ingresa por TSM, después, otras causas constantemente(9) TSM, después, TSM constantemente(2) -42.13 [-121.85, 37.59], p= 0.693

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
    dplyr::inner_join(dias_ttos_base, 
                      by = c("run" = "run"), multiple = "first")  %>%
    dplyr::group_by(clus_om9) %>%
    dplyr::summarise(mean_promedio_diff_tr = mean(promedio_diff_tr, na.rm=T),
                     sd= sd(promedio_diff_tr, na.rm=T),
                     ci_lower = mean(promedio_diff_tr, na.rm=T) - qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n()),
                     ci_upper = mean(promedio_diff_tr, na.rm=T) + qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n()),
                     n_ttos=scales::percent(sum(!is.na(promedio_diff_tr))/sum(n()))) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado1","Promedio días dif. entre ttos.", "DesvEst", "CI lo", "CI up", "% obs con tto pasado"), caption="Resumen, conglomerado vs. Promedio días de diferencia entre tratamientos")
Resumen, conglomerado vs. Promedio días de diferencia entre tratamientos
Conglomerado1 Promedio días dif. entre ttos. DesvEst CI lo CI up % obs con tto pasado
Un evento, TSM(1) 382.05430 356.84696 381.65682 382.4518 38%
Un evento, TUS(4) 390.59722 340.08323 389.17822 392.0162 37%
Un evento TSM larga duración(3) 139.88574 122.46794 135.56716 144.2043 93%
TSM, 1 año después, TSM(5) 243.73331 118.15519 238.93813 248.5285 100%
Un evento, comorbilidad(6) 296.62154 358.58018 285.63432 307.6088 57%
TSM, 2 años después, TSM(7) 458.54133 228.19200 455.32557 461.7571 100%
TSM, 2 años y medio después, TSM(8) 465.70990 321.87915 459.74394 471.6759 100%
Ingresa por TSM, después, otras causas constantemente(9) 134.66605 60.92162 129.62592 139.7062 100%
TSM, después, TSM constantemente(2) 92.53407 67.71249 -46.01498 231.0831 93%

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
    dplyr::inner_join(dias_ttos_base, 
                      by = c("run" = "run"), multiple = "first")  %>%
    dplyr::group_by(clus_om9) %>%
    dplyr::summarise(mean_promedio_diff_tr = mean(promedio_diff_tr, na.rm=T),
                     sd= sd(promedio_diff_tr, na.rm=T),
                     ci_lower = mean(promedio_diff_tr, na.rm=T) - qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n()),
                     ci_upper = mean(promedio_diff_tr, na.rm=T) + qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n()),
                     n_ttos=scales::percent(sum(!is.na(promedio_diff_tr))/sum(n()))) %>% 
  ggplot(aes(x = clus_om9, y = mean_promedio_diff_tr)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "Días entre tratamientos") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/dias_diff_entre_ttos_por_cluster_om9.png", dpi=600)
Días de diferencia entre tratamientos (promedio y bigotes en IC95%)

Días de diferencia entre tratamientos (promedio y bigotes en IC95%)

Tiempo que demora esta sección: 0.1 minutos

1.1.4. Compilación comparación covariables

Code
# conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO
#Test de fisher p=0,49
#Si bien menores a n=30 (n=16 y 15), más se autoidentifican o tienen reconocimiento por la CONADI
#A diferencia del conglomerado 1, los que tienen principalmente una recurrencia 2 años o 2 años y medio despés son más no pertenece/no se identifica (~85% vs. 79% el 1,4,3)

#PPOO Binarizada= X-squared = 10.413, df = 8, p-value = 0.2372

#Mortalidad vs. conglomerado
#X-squared = 64.113, df = 8, p-value = 7.225e-11
#p-value = 2e-05
#El 20% de los del grupo 9 y el 7% (que son los que reingresan constantemente por otras causas) (Post hoc res.= 6.58, p=<0.001)
#Pero también los de Un evento TSM larga duración(3)    mueren más (Post-hoc res.= 2.24, p=0.4566)
#Un evento, TSM(1) tiene menos (Posthoc res.=-4.10; p<0.001)


#RM/noRM vs. conglomerado
#X-squared = 53.905, df = 8, p-value = 7.203e-09
##Un evento, TUS(4), menos en RM (post-hoc res.=-5.30, p<0.001)
#TSM, 1 año después, TSM(5), más de RM (post-hoc res=3.00, p=0,048)
#Un evento, comorbilidad(6), más de RM (post-hoc res=3.66, p=0.005)
#

#Por macrozona
#X-squared = 173.09, df = 40, p-value < 2.2e-16
#p-value = 1e-05
# Un evento, TSM(1), más Macrozona Norte (4.29 (p=0.001)), menos Sur (-5.12 (p=0.000))
# Un evento, TUS(4), menos Macrozona Norte (-3.81 (p=0.007)), más Sur (8.85 (p=0.000)), menos RM (-4.95 (p=0.000))
# Un evento, comorbilidad(6), más RM (3.75 (p=0.010)), 


# Conglomerado vs. Sexo
# X-squared = 246.11, df = 8, p-value < 2.2e-16
# Un evento, TSM(1), más mujeres (posthoc=9.55  <0.001)
#Un evento, TUS(4), menos mujeres (posthoc= -13.55  p<0.001)
#Un evento, comorbilidad(6) menos mujeres   (posthoc= -6.83 <0.001)
#

#Un evento de TS;larga duración. tiende a ser levemente menor al resto (en torno a los 20 años); mientras que Un evento, TUS(4), son mayor (en torno a los 22-23 años); seguido por quienes están por comorbildiad

#Previsión y conglomerado
#X-squared = 17.51, df = 8, p-value = 0.02521
#p-value = 0.01839
#TSM, 2 años después, TSM(7), menos en FONASA A
#ISAPRE
#X-squared = 14.445, df = 8, p-value = 0.07088
#p-value = 0.05836
#No sig.
#
#Días de tratamiento
#Mucho menos días, Un evento, TUS(4) (9 días prom) y    Un evento, TSM(1)  (11 días prom)
#Muchos más días en primedio. TSM, después, TSM constantemente(2) (162 días prom)

# 1 Un evento, TSM(1)                                11.4   13.4     11.0      11.8
# 2 Un evento, TUS(4)                                9.32  18.8      7.90     10.7
# 3 Un evento TSM larga duración(3)                  27.6   39.7     23.3      32.0
# 4 TSM, 1 año después, TSM(5)                       22.6   36.6     17.8      27.4
# 5 Un evento, comorbilidad(6)                       26.4   80.6     15.4      37.4
# 6 TSM, 2 años después, TSM(7)                      18.5   19.6     15.3      21.8
# 7 TSM, 2 años y medio después, TSM(8)              23.3   27.0     17.4      29.3
# 8 Ingresa por TSM, después, otras causas constantemente(9)9.79   9.46     4.75     14.8
# 9 TSM, después, TSM constantemente(2)             162.   250.      23.2     300. 

# Definir los datos correctamente
data_om9 <- data.frame(
  Grupo = c('1', '2', '3', '4', '5', '6', '7', '8', '9'),
  Mortalidad = c('-',NA, '+', NA, NA, NA, NA, NA, NA),
  Macrozona_Norte = c('+', '-', NA, NA, NA, NA, NA, NA, NA),
  Macrozona_Sur = c('-', '+', NA, NA, NA, NA, NA, NA, NA),
  RM = c(NA, '-', NA, '+', '+', NA, NA, NA, NA),
  Sexo_Mujeres = c('+', '-', NA, NA, '-', NA, NA, NA, NA),
  Edad = c(NA, '+', '-', NA, '+', NA, NA, NA, NA),
  Previsión = c(NA, NA, NA, NA, NA, '-', NA, NA, NA),
  Dias_en_tto = c(NA, '-', NA, NA, NA, '+', NA, NA, NA)
)

#
# Asegurar que los nombres de las columnas sean válidos y no haya espacios en blanco
colnames(data_om9) <- c('Grupo', 'Mortalidad', 'Macrozona\nNorte', 'Macrozona\nSur', 'RM', 'Sexo\n(Mujeres)', 'Edad', 'FONASA A', 'Dias_en\ntto.')

# Derretir el dataframe para que sea adecuado para ggplot2
data_melt_om9 <- reshape2::melt(data_om9, id.vars = 'Grupo', variable.name = 'Variable', value.name = 'Asociación')

# Reemplazar los NA por un valor vacío
data_melt_om9$Asociación[is.na(data_melt_om9$Asociación)] <- "\n"

# Crear el gráfico con ggplot
data_melt_om9 %>% 
  dplyr::mutate(Variable = gsub("_", " ", Variable)) %>% 
ggplot(aes(x = Variable, y = Grupo, fill = Asociación)) +
  geom_tile(color = "white", size = 0.8) +
  scale_fill_manual(values = c("+" = "#556B2F", "-" = "#E2725B", "\n" = "white")) +
  labs(title =NULL, x = "Variables", y = "Conglomerado") +
  theme_minimal() +
  theme(#axis.text.x = element_text(angle = 45, hjust = 1),
        panel.grid = element_blank())+
  theme(
    axis.text.y = element_text(size = 17, face = "bold"),#,margin = margin(l = 7)),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 17, face = "bold"),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 16, face = "bold"),#,margin = margin(t = -15)),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 16, face = "bold"),          # Tamaño del título del eje Y
    plot.title = NULL,  # Tamaño y estilo del título del gráfico
    legend.title = element_text(size = 17, face = "bold"),          # Tamaño del título de la leyenda
    legend.spacing.y = unit(1.5, "lines"),
    legend.box.spacing = unit(0.5, "lines"),      # Controla el espacio entre la leyenda y el gráfico
    legend.margin = margin(5, 5, 5, 5),  
    legend.key.height = unit(1, "cm"),  
    legend.text = element_text(size = 15, face = "bold")            # Tamaño del texto de la leyenda
  ) +
  coord_flip()
ggsave("_figs/asociaciones_om9.png", width=8.8*.8, height=5*.8, dpi=1000)
Comparación covariables con agrupamiento 9 conglomerados

Comparación covariables con agrupamiento 9 conglomerados

Tiempo que demora esta sección: 0.1 minutos

2. PAM (OM), sol 6 cluster

2.1. PAM (OM), sol 6 cluster- diagnósticos

Code
invisible("info de validación de modelos con bootstrap")
# PAM Trimestral= La solución de 4 y 6 o 7 cluster parecen tener buenos índices de calidad. 
# De todas formas, los índices ASW se encuentran en niveles que reflejan buena calidad, 
# 6 - 7 cluster reflejan de mejor forma las distancias entre los puntos.
# 
# Comb= ASW todos sobre umbral (density, todos sobre distribución); HC todos sobre 
# umbral (density, 7 a 10, 3 y 2 sobre el umbral); HG debajo umbral (density, 3 a 15 
# debajo distribución, 2 en distribución); PBC debajo umbral (density, 12 y 13 en distribución
# , 14 y 15 sobre, 2 a 11, debajo)
# Seq= ASW todos sobre umbral (2 en distribución, 3 en adelante, sobre distribución); 
# HC 2 a 9 sobre umbral (density, todos debajo); 6 en adelante sobre umbral HG 
# (density, 5 en adelante sobre distribución, resto en distribución); PBC sobre umbral 
# desde 5 en adelante (density, sobre distribución desde 6 en adelante) 
# 6 EN ADELANTE PODRÍA SER DISTINTO A NULO
# 
invisible("Hacemos clasificación de pertenencia cluster y ponemos etiquetas")
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam <-
  factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")),
         labels= c("6035_Un evento, TSM", "6025_Un evento, TUS", "5939_Un evento TSM larga duración", "5989_Un evento, comorbilidad", "6036_TSM, 1 año después, otras causas", "5710_TSM, 1 año después, TSM"))

Tiempo que demora esta sección: 0 minutos

Vemos los diagnósticos que vienen después de aquellos cluster con más de un ingreso.

Code
diag_6036<-
df_filled %>% 
  dplyr::filter(run %in% subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, clus_pam=="6036_TSM, 1 año después, otras causas")$run) %>% 
  dplyr::select(run, diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11, fecha_egreso_rec_fmt, estab_homo) %>% 
  dplyr::group_by(run) %>%
  dplyr::filter(row_number() != 1) %>%  # Elimina la primera observación de cada run
  dplyr::mutate(
    all_diags = paste(na.omit(c(diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11)), collapse = ", ")
  ) %>%
  dplyr::summarise(
    all_diags = first(all_diags),
    fecha_egreso_rec_fmt = first(fecha_egreso_rec_fmt),
    estab_homo = first(estab_homo)
  ) %>%
  dplyr::ungroup() %>% 
  dplyr::pull(all_diags) %>%  # Extraer la columna all_diags como vector
  strsplit(split = ", ") %>%  # Separar cada diagnóstico por comas
  unlist()  # Convertir la lista en un vector
# 1. **F192** (25, 2.96%): Trastorno mental y del comportamiento debido al uso de múltiples drogas y al uso de otras sustancias psicoactivas, síndrome de abstinencia.
# 2. **F609** (17, 2.01%): Trastorno específico de la personalidad no especificado.
# 3. **O800** (17, 2.01%): Parto espontáneo por vía vaginal.
# 4. **F603** (16, 1.89%): Trastorno de la personalidad emocionalmente inestable, tipo impulsivo.
# 5. **E101** (15, 1.77%): Diabetes mellitus insulino-dependiente, no controlada.
# 6. **Z370** (14, 1.65%): Nacimiento de un solo feto nacido vivo.
# 7. **F322** (13, 1.54%): Episodio depresivo grave sin síntomas psicóticos.
# 8. **G409** (13, 1.54%): Epilepsia, no especificada.
# 9. **N390** (13, 1.54%): Infección del tracto urinario, sitio no especificado.
# 10. **Z518** (13, 1.54%): Otras atenciones médicas especificadas.
# 11. **T509** (10, 1.18%): Envenenamiento por otros psicotrópicos y sustancias psicotrópicas no especificadas.
# 12. **G629** (8, 0.95%): Polineuropatía, no especificada.
# 13. **K358** (8, 0.95%): Apendicitis crónica.
# 14. **N10X** (8, 0.95%): Nefritis tubulointersticial aguda.
# 15. **O829** (8, 0.95%): Parto por cesárea no especificado.
# 16. **F191** (7, 0.83%): Trastorno mental y del comportamiento debido al uso de múltiples drogas y al uso de otras sustancias psicoactivas, dependencia actual.
# 17. **F329** (7, 0.83%): Episodio depresivo no especificado.
# 18. **Z291** (7, 0.83%): Asesoramiento sobre la prevención del abuso de sustancias psicoactivas.
# 19. **F199** (6, 0.71%): Trastorno mental y del comportamiento debido al uso de múltiples drogas y al uso de otras sustancias psicoactivas, no especificado.
# 20. **K808** (6, 0.71%): Cálculo de la vesícula biliar sin colecistitis.
# 21. **O470** (6, 0.71%): Falso trabajo de parto.
# 22. **O809** (6, 0.71%): Parto por vía vaginal no especificado.
# 23. **O821** (5, 0.59%): Parto por cesárea electiva.
# 24. **R458** (5, 0.59%): Otros síntomas y signos que involucran el estado emocional.
# 25. **X590** (5, 0.59%): Exposición a otros factores no especificados.
# 26. **Z910** (5, 0.59%): Antecedentes personales de riesgo no especificado.
# 
invisible("6035 (n=4476): trayectoria con sólo un evento hosp por TSM")
invisible("6025 (n=680): trayectoria con sólo un evento hosp. con TUS")
invisible("5939 (n=319): trayectoria con 2 trimestres continuis por morbilidad psiquiátrica")
invisible("5989 (n=207): trayectoria de sólo un evento en por comorbilidad")
invisible("6036 (n=202): trayectoria de morbilidad, pero a los 4 trimestres posteriores tienen ingresos por otras causas")

invisible("cuáles son esas causas principalmente??, son distintas de las que tiene la población?")
invisible("5710 (n=154): trayectoria de morbilidad, pero a los 4 trimestres posteriores tienen ingresos por morbilidad")
invisible("qué morbilidad principalmente??, son distintas de las que tiene la población?")

Tiempo que demora esta sección: 0 minutos

Code
diag_5710<-
  df_filled %>% 
  dplyr::filter(run %in% subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, clus_pam=="5710_TSM, 1 año después, TSM")$run) %>% 
  dplyr::select(run, diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11, fecha_egreso_rec_fmt, estab_homo) %>% 
  dplyr::group_by(run) %>%
  dplyr::filter(row_number() != 1) %>%  # Elimina la primera observación de cada run
  dplyr::mutate(
    all_diags = paste(na.omit(c(diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11)), collapse = ", ")
  ) %>%
  dplyr::summarise(
    all_diags = first(all_diags),
    fecha_egreso_rec_fmt = first(fecha_egreso_rec_fmt),
    estab_homo = first(estab_homo)
  ) %>%
  dplyr::ungroup() %>% 
  dplyr::pull(all_diags) %>%  # Extraer la columna all_diags como vector
  strsplit(split = ", ") %>%  # Separar cada diagnóstico por comas
  unlist()  # Convertir la lista en un vector
# 
# 1. **F603** (71, 5.97%): Trastorno de la personalidad emocionalmente inestable, tipo impulsivo.
# 2. **F609** (54, 4.54%): Trastorno específico de la personalidad no especificado.
# 3. **F329** (51, 4.29%): Episodio depresivo no especificado.
# 4. **F322** (47, 3.95%): Episodio depresivo grave sin síntomas psicóticos.
# 5. **F319** (43, 3.61%): Trastorno depresivo recurrente, episodio no especificado.
# 6. **F209** (42, 3.53%): Esquizofrenia, no especificada.
# 7. **F200** (40, 3.36%): Esquizofrenia paranoide.
# 8. **F192** (33, 2.77%): Trastorno mental y del comportamiento debido al uso de múltiples drogas y al uso de otras sustancias psicoactivas, síndrome de abstinencia.
# 9. **C490** (29, 2.44%): Tumor maligno de tejido mesotelial y tejido blando, sitio no especificado.
# 10. **G909** (21, 1.76%): Trastorno no especificado del sistema nervioso autónomo.
# 11. **Z511** (20, 1.68%): Atención para tratamiento de tumores malignos.
# 12. **F432** (17, 1.43%): Reacción de estrés agudo.
# 13. **F431** (16, 1.34%): Trastorno de estrés postraumático.
# 14. **F449** (15, 1.26%): Trastorno de ansiedad no especificado.
# 15. **F070** (14, 1.18%): Trastornos orgánicos de la personalidad.
# 16. **Z915** (14, 1.18%): Historia personal de lesión autoinfligida.
# 17. **F191** (12, 1.01%): Trastorno mental y del comportamiento debido al uso de múltiples drogas y al uso de otras sustancias psicoactivas, dependencia actual.
# 18. **E669** (11, 0.92%): Obesidad no especificada.
# 19. **T424** (11, 0.92%): Intoxicación por otros psicotrópicos.
# 20. **F608** (10, 0.84%): Otros trastornos específicos de la personalidad.
# 21. **G409** (10, 0.84%): Epilepsia, no especificada.

Tiempo que demora esta sección: 0 minutos

Luego vemos la clasificación de PPOO por cluster

Code
janitor::chisq.test(df_filled[,c("run","glosa_pueblo_originario")] %>% 
        dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run", "clus_pam")], by="run", multiple="first") %>% 
        janitor::tabyl(glosa_pueblo_originario, clus_pam))

    Pearson's Chi-squared test

data:  df_filled[, c("run", "glosa_pueblo_originario")] %>% dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,     c("run", "clus_pam")], by = "run", multiple = "first") %>%     janitor::tabyl(glosa_pueblo_originario, clus_pam)
X-squared = 187.03, df = 40, p-value < 2.2e-16

Tiempo que demora esta sección: 0 minutos

Generamos un gráfico de PPOO por cada conglomerado.

Code
ppoo_clus<-
  df_filled[,c("run","glosa_pueblo_originario")] %>% 
  dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run", "clus_pam","factor_inclusivo_real_hist_mas_autperc")], by="run", multiple="first") %>% 
  dplyr::mutate(glosa_pueblo_originario_rec= dplyr::case_when(glosa_pueblo_originario=="NINGUNO" & factor_inclusivo_real_hist_mas_autperc!="00"~ "DESCONOCIDO", T~glosa_pueblo_originario)) %>% 
  janitor::tabyl(glosa_pueblo_originario_rec, clus_pam) %>% 
  janitor::adorn_percentages("row")

reshape2::melt(ppoo_clus, id.vars = "glosa_pueblo_originario_rec") %>% 
  dplyr::mutate(glosa_pueblo_originario_rec= 
    dplyr::recode(glosa_pueblo_originario_rec, 
      "OTRO (ESPECIFICAR)"="OTRO(n=77)", 
      "RAPA NUI (PASCUENSE)"="RAPA NUI(n=34)", 
      "YAGÁN (YÁMANA)"="YAGÁN(n=2)",
      "AYMARA"="AYMARA(n=13)",
      "COLLA"="COLLA(n=6)",
      "DIAGUITA"="DIAGUITA(n=3)",
      "KAWÉSQAR"="KAWÉSQAR(n=4)",
      "MAPUCHE"="MAPUCHE(n=255)",
      "DESCONOCIDO"=".DESCONOCIDO(n=1.985)",
      "NINGUNO"=".NINGUNO(n=9.156)")) %>% 
  #dplyr::filter(glosa_pueblo_originario!="NINGUNO") %>% 
  # dplyr::mutate(variable= 
  #   dplyr::recode(variable, "6036_TSM, 1 año después, otras causas"="6036_TSM, 1 año\ndespués, otras causas",
  #                  "5710_TSM, 1 año después, TSM"="5710_TSM, 1 año\ndespués, TSM",
  #                 "5939_Un evento TSM larga duración"="5939_Un evento TSM\nlarga duración",
  #                 "5989_Un evento, comorbilidad"="5989_Un evento,\ncomorbilidad")) %>% 
ggplot(aes(x = glosa_pueblo_originario_rec, y = value, fill = variable)) + 
  geom_bar(stat = "identity", position = "fill") + 
  scale_fill_manual(values = c("#E27A5B","#6B8E23", "#D2B48C", "#696969", "#BDB76B", "#4682B4")) +
  labs(title = NULL,
       x = "Grupo Étnico",
       y = "Proporción de Casos",
       fill = "Grupos") +  # Cambia el título de la leyenda a "Grupos"
  theme_minimal() +
  theme(
    axis.text.y = element_text(size = 12),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 12),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 14),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 14),          # Tamaño del título del eje Y
    plot.title = NULL,  # Tamaño y estilo del título del gráfico
    legend.title = element_text(size = 14, margin = margin(b = -.1)),          # Tamaño del título de la leyenda
    legend.spacing.y = unit(1.5, "lines"),
    legend.box.spacing = unit(0.5, "lines"),      # Controla el espacio entre la leyenda y el gráfico
    legend.margin = margin(5, 5, 5, 5),  
    legend.key.height = unit(1, "cm"),  
    legend.text = element_text(size = 12)            # Tamaño del texto de la leyenda
    ) + 
  coord_flip()  # Hacer el gráfico horizontal
ggsave("grafico_ancho_achatado.png", width = 8, height = 3, dpi=1000)
PPOO por cluster

PPOO por cluster

Tiempo que demora esta sección: 0 minutos

Vemos los gráficos de las trayectorias

Code
categories<-attr(States_Wide.seq_quarter_t_prim_adm_cens, "labels")
new_labels <- categories
new_labels[which(categories == "Otras causas")] <- "Otras\ncausas"
#new_labels[which(categories == "Consumo\nde sustancias")] <- "Consumo de\nsustancias"



seq_plot <- ggseqiplot(States_Wide.seq_quarter_t_prim_adm_cens, 
                       group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name"))), 
                       facet_ncol=3, facet_nrow=3) +
  theme(legend.position = "none")+
  labs(x="Trimestres", y="# IDs de usuarios")+
  #guides(fill = guide_legend(nrow = 1))+
    theme(
    axis.text.y = element_text(size = 15),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 15),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 15),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 15, margin = margin(r = -10)),#,margin = margin(l = -10)),
    strip.text = element_text(size = 16, margin = margin(b =-15)),
    legend.text = element_text(size = 15),
    legend.spacing.x = unit(0.1, 'cm'),  # Alinea el título de la leyenda hacia la izquierda
    legend.box.margin = margin(t = 0, r = 0, b = 0, l = -50),
    legend.position = "bottom", 
    legend.justification = "left",
    panel.spacing.y = unit(0.5, "lines")
    #legend.key.size = unit(1.5, "lines"),        # Aumenta el tamaño de los símbolos en la leyenda
  )+
  guides(fill = guide_legend(nrow = 1)) +
  scale_fill_manual(labels = new_labels, values=c("#E2725B", "#556B2F", "#D2B48C",#"#8B4513",
                                                  "#FFFFFF","#808080","#000000"))
seq_plot
ggsave(filename="clusterspam_om6_mod.png",seq_plot,  width = 8.5, height = 5.5, dpi=1000)

table_data_pam6 <- sprintf("%1.2f",pamRange_quarter_om$stats[5,])
table_data_pam6 <-as.data.frame(t(table_data_pam6))
colnames(table_data_pam6)<-attr(pamRange_quarter_om$stats, "name")

table_data_pam6 %>% knitr::kable()
PBC HG HGSD ASW ASWw CH R2 CHsq R2sq HC
0.59 0.78 0.77 0.60 0.60 775.27 0.39 1199.95 0.50 0.10

Trayectorias de hospitalización, orden de sujetos según el primer estado observado y su duración, representando a cada individuo como una línea en el gráfico.

Trayectorias de hospitalización, orden de sujetos según el primer estado observado y su duración, representando a cada individuo como una línea en el gráfico.

Trayectorias de hospitalización, orden de sujetos según el primer estado observado y su duración, representando a cada individuo como una línea en el gráfico.

Tiempo que demora esta sección: 0.3 minutos

Code
seq_plot2 <-ggseqdplot(States_Wide.seq_quarter_t_prim_adm_cens, 
                       group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name"))), 
                       facet_ncol=3, facet_nrow=3) +
  theme(legend.position = "none")+  # Colocar la leyenda abajo
  labs(x="Trimestres", y="Frecuencia relativa de estados")+
  theme(
    axis.text.y = element_text(size = 15),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 15),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 15),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 15, margin = margin(r = -5)),
    strip.text = element_text(size = 15),
    panel.spacing.y = unit(0.5, "lines")
  )  # Colocar la leyenda abajo
seq_plot2
ggsave("clusterspam_om62_mod.png",seq_plot2, width = 8, height = 5.5, dpi=1000)
Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Tiempo que demora esta sección: 0.1 minutos

De este modo, presenta el cambio agregado en la distribución de estados a lo largo del tiempo, sin considerar las secuencias individuales.

2.1.1.Exploración transiciones

2.1.1.a Transiciones- RM y no RM

Tasas de transición no RM a RM y viceversa

Code
invisible("Tasas de transición no RM a RM y viceversa")

trim_tasa_pam_clus6_cens_cnt<-  
  seqcount_t(States_Wide.seq_quarter_t_prim_adm_RM_cens, 
             group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>% 
  dplyr::filter(count>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .))) 
trim_tasa_pam_clus6_cens_rate<-  
  seqtrate_t(States_Wide.seq_quarter_t_prim_adm_RM_cens, 
             group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>% 
  dplyr::filter(rate>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .)))

Tiempo que demora esta sección: 0 minutos

Code
trim_tasa_pam_clus6_cens_rate %>%   
  dplyr::left_join(trim_tasa_pam_clus6_cens_cnt, by=c("from"="from", "glosa_sexo"="glosa_sexo","to"="to")) %>% 
  dplyr::rename("recuento"="count") %>% 
  dplyr::filter(from %in% c("RM", "noRM")) %>%  
  dplyr::mutate(glosa_sexo= factor(glosa_sexo,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>%
  ggplot(aes(x = from, y = to, fill = rate, size=log(recuento+1))) +
  geom_tile() +
  coord_flip()+
  scale_fill_gradient(low = "white", high = "blue") + # Ajusta la escala de colores según tus preferencias
  labs(title = "Tasas de transición, Trimestre (s/censura)",
       x = "Desde",
       y = "Hacia",
       fill = "Rate") +
  theme_minimal() +
  facet_wrap(~glosa_sexo)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  geom_text(aes(label = sprintf("%1.2f", rate), size =log(recuento+1)*.5), color = "black")

invisible("Hay muy pocos casos que se entrecruzan entre noRM y RM (fuera de la diagnonal)")
Porcentajes de transición no-RM y RM por cada cluster

Porcentajes de transición no-RM y RM por cada cluster

Tiempo que demora esta sección: 0.1 minutos

Hay muy pocos casos que se entrecruzan entre noRM y RM (fuera de la diagnonal)

2.1.1.b Transiciones
Code
trim_tasa2_pam_clus6_cens_cnt<-  
  seqcount_t(States_Wide.seq_quarter_t_prim_adm_cens, 
             group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>% 
  dplyr::filter(count>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .))) 
trim_tasa2_pam_clus6_cens_rate<-  
  seqtrate_t(States_Wide.seq_quarter_t_prim_adm_cens, 
             group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>% 
  dplyr::filter(rate>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .)))

Tiempo que demora esta sección: 0 minutos

Code
trim_tasa2_pam_clus6_cens_rate %>%   
  dplyr::left_join(trim_tasa2_pam_clus6_cens_cnt, by=c("from"="from", "glosa_sexo"="glosa_sexo","to"="to")) %>% 
  dplyr::rename("recuento"="count") %>% 
  #dplyr::filter(from %in% c("RM", "noRM")) %>%  
  dplyr::mutate(glosa_sexo= factor(glosa_sexo,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>%
  ggplot(aes(x = from, y = to, fill = rate, size=log(recuento+1))) +
  geom_tile() +
  coord_flip()+
  scale_fill_gradient(low = "white", high = "blue") + # Ajusta la escala de colores según tus preferencias
  labs(title = "Tasas de transición, Trimestre (s/censura)",
       x = "Desde",
       y = "Hacia",
       fill = "Rate") +
  theme_minimal() +
  facet_wrap(~glosa_sexo)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  geom_text(aes(label = sprintf("%1.2f", rate), size =log(recuento+1)*.5), color = "black")
Porcentajes de transición no-RM y RM por cada cluster

Porcentajes de transición no-RM y RM por cada cluster

Tiempo que demora esta sección: 0.1 minutos

2.1.1.c Tiempo promedio por cluster
Code
seq_mean_t(States_Wide.seq_quarter_t_prim_adm_cens, 
           factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name"))))%>% 
  data.table::as.data.table(keep.rowname=T) %>% 
  ggplot(aes(x=rn, fill= factor_inclusivo, y=Mean))+
  geom_bar(width = 1, stat = "identity") +
  theme_minimal() +
  labs(title = NULL,
       x = NULL,
       y = NULL) +
  coord_flip()+
  theme(#axis.text.x = element_blank(),
    #axis.text.y = element_blank(),
    panel.grid = element_blank()) +
#  scale_fill_brewer(palette = "Pastel1", labels=c("Sin\nautoidentificación\nni reconocimiento", "Autoidentificación\nsin reconocimiento", "Ambas")) +
  geom_text(aes(label = round(Mean,1)), 
            position = position_stack(vjust = 0.5), 
            size = 2.5, # Ajusta el tamaño de la fuente aquí
            color = "black", # Color del texto
            family = "sans", # Puedes cambiar la fuente si lo deseas
            background = element_rect(fill = "white", color = NA)) + # Fondo blanco
  theme(legend.title = element_blank())

invisible("No me aporta mucho")
# seq_mean_t_dos_grupos(States_Wide.seq_quarter_t_prim_adm_cens, group1=ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam, group2=ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc)
Tiempo promedio en cada estado por estatus PPOO (Trimestral c/censura)

Tiempo promedio en cada estado por estatus PPOO (Trimestral c/censura)

Tiempo que demora esta sección: 0.1 minutos

2.1.2. Propiedades secuencias

Vemos el número de transiciones, número de subsecuencias y la entropía

Code
## number of transitions 
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$ntrans <- as.numeric(seqtransn(States_Wide.seq_quarter_t_prim_adm))
## number of subsequences
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$subsn  <- as.numeric(seqsubsn(States_Wide.seq_quarter_t_prim_adm))

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$entropy_long <- as.numeric(seqient(States_Wide.seq_quarter_t_prim_adm))


ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::group_by(clus_pam) %>% 
  dplyr::summarise(promedio_entropia= mean(entropy_long), 
                   mediana_entropia= quantile(entropy_long, .5),
                   p25_entropia= quantile(entropy_long, .25),
                   p75_entropia= quantile(entropy_long, .75),
                   promedio_n_trans= mean(ntrans), #Las transiciones se refieren a los cambios de estado en las secuencias.
                   sd_n_trans= sd(ntrans), #subsecuencia es una parte de una secuencia más larga que respeta el orden temporal original, 
                   #pero no necesariamente contiene todos los estados
                   promedio_subsn= mean(subsn), 
                   sd_subsn= sd(subsn)) %>% 
  dplyr::mutate_if(is.numeric, ~ sprintf("%1.2f", .)) %>% 
  knitr::kable("html", col.names = c("Cluster", "Promedio Entropía", "Mediana Entropía", "Entropía Percentil 25", "Entropía Percentil 75", "Promedio Número de Transiciones", "Desviación Estándar Número de Transiciones", "Promedio Número de Subsecuencias", "Desviación Estándar Número de Subsecuencias"), caption="Resumen de Métricas por Cluster")
Resumen de Métricas por Cluster
Cluster Promedio Entropía Mediana Entropía Entropía Percentil 25 Entropía Percentil 75 Promedio Número de Transiciones Desviación Estándar Número de Transiciones Promedio Número de Subsecuencias Desviación Estándar Número de Subsecuencias
6035_Un evento, TSM 0.16 0.12 0.12 0.20 1.71 1.20 9.38 46.91
6025_Un evento, TUS 0.18 0.12 0.12 0.25 1.78 1.34 10.95 27.85
5939_Un evento TSM larga duración 0.28 0.26 0.20 0.32 2.24 1.68 17.64 52.58
5989_Un evento, comorbilidad 0.20 0.12 0.12 0.25 2.00 1.39 13.92 41.49
6036_TSM, 1 año después, otras causas 0.33 0.32 0.25 0.38 4.35 1.63 50.74 76.27
5710_TSM, 1 año después, TSM 0.37 0.38 0.27 0.43 4.62 1.99 57.57 83.32

Tiempo que demora esta sección: 0 minutos

2.1.3. Comparación variables

2.1.3.a. Comparación covariables- PPOO
Code
# round(
# prop.table(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam, 
#                  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc),1),
# 2)

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  count(clus_pam, factor_inclusivo_real_hist_mas_autperc) %>%
  group_by(clus_pam) %>%
  mutate(prop = scales::percent(n / sum(n))) %>%
  select(-n) %>%
  pivot_wider(names_from = factor_inclusivo_real_hist_mas_autperc, values_from = prop, values_fill = "0") %>% knitr::kable("markdown", col.names=c("Conglomerados","No se identifica/no pertenece", "No se identifica/hay reconocimiento", "Se identifica/hay reconocimeinto"), caption="Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO")
#        00   10   11
# 6035 0.81 0.11 0.08
# 6025 0.79 0.12 0.10
# 5939 0.83 0.11 0.07
# 5989 0.84 0.09 0.08
# 6036 0.80 0.11 0.09
# 5710 0.79 0.12 0.09
invisible("6025 tiwnw un poxo mas PPOO, lo mismo con 5710")
Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO
Conglomerados No se identifica/no pertenece No se identifica/hay reconocimiento Se identifica/hay reconocimeinto
6035_Un evento, TSM 80.6% 11.2% 8.2%
6025_Un evento, TUS 78.5% 11.6% 9.9%
5939_Un evento TSM larga duración 82.8% 10.7% 6.6%
5989_Un evento, comorbilidad 83.57% 8.70% 7.73%
6036_TSM, 1 año después, otras causas 79.7% 11.4% 8.9%
5710_TSM, 1 año después, TSM 79.2% 11.7% 9.1%

Tiempo que demora esta sección: 0 minutos

Vemos las categorías de clasificación de PPOO según autopercepción (en MINSAL y en RSH) y reconocimiento CONADI.

Code
table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc)

  00   10   11 
4863  672  503 

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc,clus_pam) %>%
    janitor::chisq.test()
#X-squared = 5.6334, df = 10, p-value = 0.8451
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc,clus_pam) %>%
    janitor::fisher.test(simulate.p.value=T, B=1e5)
# data:  .
# p-value = 0.8467
# alternative hypothesis: two.sided

    Pearson's Chi-squared test

data:  .
X-squared = 5.6334, df = 10, p-value = 0.8451


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.8454
alternative hypothesis: two.sided

Tiempo que demora esta sección: 0 minutos

Ahora lo hacemos con la versión binarizada

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc_bin<- ifelse(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc=="00",0,1)

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc_bin,clus_pam) %>%
    janitor::chisq.test()
#X-squared = 4.2566, df = 5, p-value = 0.5131

    Pearson's Chi-squared test

data:  .
X-squared = 4.2566, df = 5, p-value = 0.5131

Tiempo que demora esta sección: 0 minutos

Code
round(prop.table(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam, 
                 ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc_bin),1),2) %>% knitr::kable("markdown", col.names=c("Conglomerados","No se identifica/no pertenece", "Se identifica/pertenece"), caption="Porcentajes por fila, conglomerado vs. Pertenencia/identificación PPOO")
Porcentajes por fila, conglomerado vs. Pertenencia/identificación PPOO
Conglomerados No se identifica/no pertenece Se identifica/pertenece
6035_Un evento, TSM 0.81 0.19
6025_Un evento, TUS 0.79 0.21
5939_Un evento TSM larga duración 0.83 0.17
5989_Un evento, comorbilidad 0.84 0.16
6036_TSM, 1 año después, otras causas 0.80 0.20
5710_TSM, 1 año después, TSM 0.79 0.21

Tiempo que demora esta sección: 0 minutos

Hicimos una prueba post-hoc usando Bonferroni

Code
# 
# Beasley, T. M., & Schumacker, R. E. (1995). Multiple Regression Approach to Analyzing Contingency
# Tables: Post Hoc and Planned Comparison Procedures. The Journal of Experimental Education, 64(1), 79–93. https://doi.org/10.1080/00220973.1995.9943797

chisq.posthoc.test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam, 
                         ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc_bin), method = "bonferroni") %>% 
    pivot_longer(cols = c(`0`, `1`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group==1) %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", Residuals)) %>% 
    select(Code, Evento, Residuals, `p values`) %>% 
  knitr::kable("markdown", col.names=c("Código","Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. Pertenencia/identificación PPOO")
Post-hoc, conglomerado vs. Pertenencia/identificación PPOO
Código Descripción Residuos Sig.
6035 Un evento, TSM -0.30 1
6025 Un evento, TUS 1.41 1
5939 Un evento TSM larga duración -1.03 1
5989 Un evento, comorbilidad -1.12 1
6036 TSM, 1 año después, otras causas 0.31 1
5710 TSM, 1 año después, TSM 0.42 1

Tiempo que demora esta sección: 0 minutos

2.1.3.b. Comparación covariables- Mortalidad
Code
# 
invisible("No hay nada, el tiempo promedio de censura es similar")

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
  janitor::tabyl(clus_pam,death_time_rec) %>% 
  janitor::adorn_percentages("row")%>%
  dplyr::mutate(`1`=scales::percent(`1`, accuracy=.1)) %>% 
  dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::group_by(clus_pam) %>% 
  dplyr::summarise(mean=sprintf("%1.1f",mean(cens_time))), by="clus_pam") %>% 
  dplyr::select(-`0`) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado","Mortalidad observada", "Promedio"), caption="Post-hoc, conglomerado vs.Mortalidad y tiempo a censura")
Post-hoc, conglomerado vs.Mortalidad y tiempo a censura
Conglomerado Mortalidad observada Promedio
6035_Un evento, TSM 0.9% 17.9
6025_Un evento, TUS 1.9% 18.2
5939_Un evento TSM larga duración 2.2% 18.0
5989_Un evento, comorbilidad 1.9% 18.1
6036_TSM, 1 año después, otras causas 1.0% 17.8
5710_TSM, 1 año después, TSM 1.9% 18.1

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
             janitor::tabyl(death_time_rec,clus_pam) %>% 
              janitor::chisq.test(correct=T)
#X-squared = 10.621, df = 5, p-value = 0.05943


ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
             janitor::tabyl(death_time_rec,clus_pam) %>% 
              janitor::fisher.test(simulate.p.value=T, B=1e5)
#p-value = 0.03169
invisible("no se basa en la distribución chi-cuadrado. Fisher se basa en permutaciones exactas, por lo que no se calculan df.")

invisible("Podría haber algo aquí, aunque son números pequeños")
invisible("6036 (morbilidad y a los 4 meses otras causas) y 6035 (sólo un evento por trno.SM) tienen un 1% de gente que muere antes")
invisible("5939 (dos semestres continuos por morbilidad psiquiátrica) en cambio, tiene 2.2%")

#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_
##_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_
tabla_cluster_mortalidad<- 
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1))

chisq.posthoc.test(table(tabla_cluster_mortalidad$clus_pam,
                         tabla_cluster_mortalidad$death_time_rec))%>% 
    pivot_longer(cols = c(`0`, `1`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group==1) %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", as.numeric(Residuals))) %>% 
    select(Code, Evento, Residuals, `p values`) %>% 
  knitr::kable("markdown", col.names=c("Código","Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. mortalidad")

    Pearson's Chi-squared test

data:  .
X-squared = 10.621, df = 5, p-value = 0.05943


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.03154
alternative hypothesis: two.sided
Post-hoc, conglomerado vs. mortalidad
Código Descripción Residuos Sig.
6035 Un evento, TSM -2.99 0.0335*
6025 Un evento, TUS 1.95 0.6201
5939 Un evento TSM larga duración 1.77 0.9118
5989 Un evento, comorbilidad 1.06 1
6036 TSM, 1 año después, otras causas -0.23 1
5710 TSM, 1 año después, TSM 0.93 1

Tiempo que demora esta sección: 0 minutos

2.1.3.c. Comparación covariables- no RM vs. RM
Code
round(
  prop.table(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam, 
                   ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base),1),
  2) %>% 
  knitr::kable("markdown", caption="Porcentajes por fila")
Porcentajes por fila
noRM RM
6035_Un evento, TSM 0.54 0.46
6025_Un evento, TUS 0.63 0.37
5939_Un evento TSM larga duración 0.50 0.50
5989_Un evento, comorbilidad 0.42 0.58
6036_TSM, 1 año después, otras causas 0.50 0.50
5710_TSM, 1 año después, TSM 0.50 0.50

Tiempo que demora esta sección: 0 minutos

Code
janitor::chisq.test(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
                      janitor::tabyl(codigo_region_rec_base,clus_pam), correct=T)
# X-squared = 39.996, df = 5, p-value = 1.496e-07

chisq.posthoc.test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam,
                         ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base))%>% 
    pivot_longer(cols = c(`noRM`, `RM`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group=="RM") %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", as.numeric(Residuals))) %>% 
    dplyr::mutate( `p values`= sprintf("%1.3f", as.numeric(gsub("\\*","",`p values`)))) %>% 
    select(Code, Evento, Residuals, `p values`) %>% 
  dplyr::mutate(`p values`= ifelse(`p values`=="0.000","<0.001",`p values`)) %>% 
  knitr::kable("markdown", col.names=c("Código","Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. atendido en RM")

    Pearson's Chi-squared test

data:  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%     janitor::tabyl(codigo_region_rec_base, clus_pam)
X-squared = 39.996, df = 5, p-value = 1.496e-07
Post-hoc, conglomerado vs. atendido en RM
Código Descripción Residuos Sig.
6035 Un evento, TSM 0.73 1.000
6025 Un evento, TUS -5.13 <0.001
5939 Un evento TSM larga duración 1.30 1.000
5989 Un evento, comorbilidad 3.66 0.003
6036 TSM, 1 año después, otras causas 1.02 1.000
5710 TSM, 1 año después, TSM 1.01 1.000

Tiempo que demora esta sección: 0 minutos

2.1.3.e. Comparación covariables- Región
Code
tabla_cluster_region<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(codigo_region, clus_pam) %>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2)

colnames(tabla_cluster_region)<- c("reg", "c6035", "c6025", "c5939", "c5989", "c6036", "c5710")
cod_reg_homo<-
data.frame(
  codigo_region = 1:16,
  nombre_region = c(
    "Región de Tarapacá",
    "Región de Antofagasta",
    "Región de Atacama",
    "Región de Coquimbo",
    "Región de Valparaíso",
    "Región del Libertador General Bernardo O'Higgins",
    "Región del Maule",
    "Región del Biobío",
    "Región de La Araucanía",
    "Región de Los Lagos",
    "Región de Aysén del General Carlos Ibáñez del Campo",
    "Región de Magallanes y de la Antártica Chilena",
    "Región Metropolitana de Santiago",
    "Región de Los Ríos",
    "Región de Arica y Parinacota",
    "Región de Ñuble"
  ),
  stringsAsFactors = FALSE
)

dplyr::mutate(tabla_cluster_region, promedio_fila = rowMeans(across(2:7))) %>% 
  dplyr::arrange(desc(promedio_fila)) %>% 
  dplyr::left_join(cod_reg_homo, by=c("reg"="codigo_region")) %>% 
  dplyr::select(reg, nombre_region, everything()) %>% 
  dplyr::select(-promedio_fila) %>% 
  dplyr::mutate_at(3:8,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentaje por comunas")
Porcentaje por comunas
reg nombre_region c6035 c6025 c5939 c5989 c6036 c5710
13 Región Metropolitana de Santiago 45% 36% 48% 57% 45% 44%
8 Región del Biobío 10% 9% 9% 9% 12% 10%
5 Región de Valparaíso 9% 13% 10% 6% 6% 8%
10 Región de Los Lagos 6% 20% 5% 11% 6% 3%
7 Región del Maule 4% 3% 3% 4% 7% 5%
9 Región de La Araucanía 5% 4% 5% 4% 2% 5%
6 Región del Libertador General Bernardo O’Higgins 4% 3% 5% 2% 4% 1%
16 Región de Ñuble 2% 2% 2% 1% 3% 4%
2 Región de Antofagasta 2% 1% 4% 1% 0% 5%
14 Región de Los Ríos 3% 3% 2% 0% 2% 3%
1 Región de Tarapacá 2% 1% 1% 1% 2% 5%
12 Región de Magallanes y de la Antártica Chilena 1% 2% 2% 1% 2% 3%
11 Región de Aysén del General Carlos Ibáñez del Campo 2% 2% 1% 3% 1% 1%
3 Región de Atacama 2% 1% 2% 0% 1% 1%
15 Región de Arica y Parinacota 2% 0% 0% 0% 2% 2%
4 Región de Coquimbo 1% 1% 1% 0% 1% 1%

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(codigo_region, clus_pam) %>% 
  janitor::fisher.test(simulate.p.value=T, B=1e5)
#p-value = 1e-05
tab_clus_reg<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                      by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
    janitor::tabyl(codigo_region, clus_pam)

chisq.posthoc.test(tab_clus_reg[-1]) %>% 
  dplyr::mutate_at(3:8, ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
  knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")

    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 1e-05
alternative hypothesis: two.sided
Comparación post-hoc, conglomerado-región
Dimension Value 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
1 Residuals 1.711 -1.782 -1.267 -1.293 -0.295 2.447
1 p values 1.000 1.000 1.000 1.000 1.000 1.000
2 Residuals 1.026 -2.282 2.255 -1.269 -1.712 1.943
2 p values 1.000 1.000 1.000 1.000 1.000 1.000
3 Residuals 1.207 -0.487 0.975 -1.831 -0.646 -0.909
3 p values 1.000 1.000 1.000 1.000 1.000 1.000
4 Residuals 1.376 -0.980 -0.575 -1.417 0.841 -0.365
4 p values 1.000 1.000 1.000 1.000 1.000 1.000
5 Residuals -1.679 3.593 0.901 -1.614 -1.270 -0.507
5 p values 1.000 0.031 1.000 1.000 1.000 1.000
6 Residuals 0.257 -0.267 1.441 -1.287 0.698 -1.535
6 p values 1.000 1.000 1.000 1.000 1.000 1.000
7 Residuals 0.802 -1.693 -1.391 -0.095 2.536 0.356
7 p values 1.000 1.000 1.000 1.000 1.000 1.000
8 Residuals 0.830 -1.202 -0.450 -0.554 1.001 0.240
8 p values 1.000 1.000 1.000 1.000 1.000 1.000
9 Residuals 1.382 -1.382 0.512 -0.268 -1.539 0.271
9 p values 1.000 1.000 1.000 1.000 1.000 1.000
10 Residuals -7.614 12.470 -1.896 1.554 -0.728 -2.129
10 p values 0.000 0.000 1.000 1.000 1.000 1.000
11 Residuals 0.536 0.797 -1.760 0.999 -0.490 -1.185
11 p values 1.000 1.000 1.000 1.000 1.000 1.000
12 Residuals -1.558 0.251 1.035 -0.650 1.149 1.795
12 p values 1.000 1.000 1.000 1.000 1.000 1.000
13 Residuals 1.346 -4.847 1.242 3.606 0.078 -0.033
13 p values 1.000 0.000 1.000 0.030 1.000 1.000
14 Residuals 1.133 0.655 -1.160 -1.929 -0.536 0.024
14 p values 1.000 1.000 1.000 1.000 1.000 1.000
15 Residuals 2.970 -2.846 -1.858 -1.283 1.048 0.378
15 p values 0.286 0.426 1.000 1.000 1.000 1.000
16 Residuals -0.110 -0.391 -0.092 -0.806 0.681 1.374
16 p values 1.000 1.000 1.000 1.000 1.000 1.000

Tiempo que demora esta sección: 0 minutos

Por macrozona

Code
tabla_cluster_macrozona<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
dplyr::mutate(macrozona = dplyr::case_when(
  codigo_region %in% c(15, 1, 2, 3) ~ "Macrozona Norte",
  codigo_region %in% c(4, 5)~ "Macrozona Centro",
  codigo_region %in% c(6, 7, 16, 8) ~ "Macrozona Centro Sur",
  codigo_region %in% c(9, 14, 10) ~ "Macrozona Sur",
  codigo_region %in% c(11, 12) ~ "Macrozona Austral",
  TRUE ~ "RM"  # En caso de que algún código no esté especificado
)) %>% 
  janitor::tabyl(macrozona, clus_pam) 

janitor::chisq.test(tabla_cluster_macrozona)
#X-squared = 140.31, df = 25, p-value < 2.2e-16

tabla_cluster_macrozona%>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2) %>% 
  dplyr::mutate_at(2:7,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. macrozona")

    Pearson's Chi-squared test

data:  tabla_cluster_macrozona
X-squared = 140.31, df = 25, p-value < 2.2e-16
Porcentajes por columna, conglomerado vs. macrozona
macrozona 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
Macrozona Austral 3% 4% 3% 4% 4% 4%
Macrozona Centro 10% 13% 11% 6% 8% 8%
Macrozona Centro Sur 20% 17% 19% 16% 27% 20%
Macrozona Norte 8% 4% 8% 2% 6% 12%
Macrozona Sur 14% 26% 12% 15% 11% 11%
RM 45% 36% 48% 57% 45% 44%

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                      by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
    janitor::tabyl(codigo_region) %>% 
    arrange(desc(percent)) %>% 
    dplyr::mutate(percent=scales::percent(percent, accuracy=.1)) %>% 
    dplyr::slice(1:5) %>% 
  knitr::kable(caption="Primeras regiones")
Primeras regiones
codigo_region n percent
13 2674 44.3%
8 593 9.8%
5 540 8.9%
10 470 7.8%
9 286 4.7%

Tiempo que demora esta sección: 0 minutos

2.1.3.f. Comparación covariables- Sexo
Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    janitor::tabyl(clus_pam, glosa_sexo)%>% 
    janitor::chisq.test()
#X-squared = 256.42, df = 5, p-value < 2.2e-16

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  janitor::tabyl(clus_pam, glosa_sexo)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 2) %>% 
  dplyr::mutate_at(2:3,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. sexo")

    Pearson's Chi-squared test

data:  .
X-squared = 256.42, df = 5, p-value < 2.2e-16
Porcentajes por columna, conglomerado vs. sexo
clus_pam HOMBRE MUJER
6035_Un evento, TSM 42% 58%
6025_Un evento, TUS 70% 30%
5939_Un evento TSM larga duración 41% 59%
5989_Un evento, comorbilidad 70% 30%
6036_TSM, 1 año después, otras causas 32% 68%
5710_TSM, 1 año después, TSM 40% 60%

Tiempo que demora esta sección: 0 minutos

Code
chisq.posthoc.test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam,ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$glosa_sexo))%>% 
    pivot_longer(cols = c(`HOMBRE`, `MUJER`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group=="MUJER") %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", as.numeric(Residuals))) %>% 
    dplyr::mutate( `p values`= sprintf("%1.3f", as.numeric(gsub("\\*","",`p values`)))) %>% 
    select(Code, Evento, Residuals, `p values`) %>% 
  dplyr::mutate(`p values`= ifelse(`p values`=="0.000","<0.001",`p values`)) %>% 
  knitr::kable("markdown", col.names=c("Código","Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. sexo")
Post-hoc, conglomerado vs. sexo
Código Descripción Residuos Sig.
6035 Un evento, TSM 9.61 <0.001
6025 Un evento, TUS -13.62 <0.001
5939 Un evento TSM larga duración 1.85 0.770
5989 Un evento, comorbilidad -6.99 <0.001
6036 TSM, 1 año después, otras causas 3.95 0.001
5710 TSM, 1 año después, TSM 1.56 1.000

Tiempo que demora esta sección: 0 minutos

2.1.3.g. Comparación covariables- Edad
Code
dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
  dplyr::filter(quarter == 0) %>%
  dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam")], by="run") %>%
  dplyr::group_by(clus_pam) %>%
  dplyr::summarise(mean_edad = mean(min_edad_anos),
                   sd= sd(min_edad_anos),
                   ci_lower = mean(min_edad_anos) - qt(0.975, n()-1) * sd(min_edad_anos)/sqrt(n()),
                   ci_upper = mean(min_edad_anos) + qt(0.975, n()-1) * sd(min_edad_anos)/sqrt(n())) %>% # Plot con ggplot2
ggplot(aes(x = clus_pam, y = mean_edad)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "Edad promedio") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/edad_minima_por_cluster.png", dpi=600)
Edad promedio primer ingreso con intervalo de confianza por conglomerado

Edad promedio primer ingreso con intervalo de confianza por conglomerado

Tiempo que demora esta sección: 0.1 minutos

Code
anova <- oneway.test(min_edad_anos ~ clus_pam, 
             data = dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
               dplyr::filter(quarter == 0) %>%
               dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam")], by="run"),var.equal = F)

# Ver los resultados del ANOVA
print(anova)

    One-way analysis of means (not assuming equal variances)

data:  min_edad_anos and clus_pam
F = 31.673, num df = 5.00, denom df = 604.01, p-value < 2.2e-16

Tiempo que demora esta sección: 0 minutos

2.1.3.h. Comparación covariables- Previsión
Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    janitor::tabyl(clus_pam, prev_benef_rec_post)%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }
#X-squared = 34.049, df = 20, p-value = 0.0258
#p-value = 0.02341 Fisher

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  janitor::tabyl(clus_pam, prev_benef_rec_post)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate_at(2:6,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. Beneficios")

    Pearson's Chi-squared test

data:  .
X-squared = 34.049, df = 20, p-value = 0.0258


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.02284
alternative hypothesis: two.sided
Porcentajes por columna, conglomerado vs. Beneficios
clus_pam FFAA FONASA A FONASA BC FONASA D ISAPRE
6035_Un evento, TSM 4.4% 26.4% 32.1% 11.8% 25.4%
6025_Un evento, TUS 1.9% 28.2% 31.9% 14.4% 23.5%
5939_Un evento TSM larga duración 3.8% 30.1% 31.0% 11.3% 23.8%
5989_Un evento, comorbilidad 1.4% 27.1% 38.6% 12.6% 20.3%
6036_TSM, 1 año después, otras causas 2.0% 25.7% 37.1% 8.9% 26.2%
5710_TSM, 1 año después, TSM 1.3% 27.9% 37.0% 9.7% 24.0%

Tiempo que demora esta sección: 0 minutos

Code
base_tabla_cluster_benef_fonasa_a<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>%
  dplyr::mutate(prev_benef_rec_post_a = ifelse(prev_benef_rec_post== "FONASA A",1,0))


chisq.posthoc.test(table(base_tabla_cluster_benef_fonasa_a$prev_benef_rec_post, 
                         base_tabla_cluster_benef_fonasa_a$clus_pam)) %>% 
  dplyr::mutate_at(3:8, ~round(as.numeric(gsub("\\*","",.)),2)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-previsión")
Comparación post-hoc, conglomerado-previsión
Dimension Value 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
FFAA Residuals 3.91 -2.74 -0.05 -1.80 -1.38 -1.65
FFAA p values 0.00 0.18 1.00 1.00 1.00 1.00
FONASA A Residuals -1.32 0.88 1.35 0.07 -0.35 0.31
FONASA A p values 1.00 1.00 1.00 1.00 1.00 1.00
FONASA BC Residuals -1.27 -0.35 -0.58 1.92 1.43 1.21
FONASA BC p values 1.00 1.00 1.00 1.00 1.00 1.00
FONASA D Residuals -0.59 2.11 -0.37 0.28 -1.35 -0.85
FONASA D p values 1.00 1.00 1.00 1.00 1.00 1.00
ISAPRE Residuals 1.43 -0.88 -0.46 -1.56 0.44 -0.26
ISAPRE p values 1.00 1.00 1.00 1.00 1.00 1.00

Tiempo que demora esta sección: 0 minutos

2.1.3.h.a. FONASA A vs. otros
Code
base_tabla_cluster_benef_fonasa_a %>% 
    janitor::tabyl(clus_pam, prev_benef_rec_post_a)%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }

    Pearson's Chi-squared test

data:  .
X-squared = 3.0869, df = 5, p-value = 0.6866


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.6756
alternative hypothesis: two.sided
Code
#X-squared = 3.0869, df = 5, p-value = 0.6866
#p-value = 0.6815

base_tabla_cluster_benef_fonasa_a %>% 
  janitor::tabyl(clus_pam, prev_benef_rec_post_a)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate_at(2:3,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)", col.names= c("Conglomerado", "Resto", "FONASA A"))
Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)
Conglomerado Resto FONASA A
6035_Un evento, TSM 73.6% 26.4%
6025_Un evento, TUS 71.8% 28.2%
5939_Un evento TSM larga duración 69.9% 30.1%
5989_Un evento, comorbilidad 72.9% 27.1%
6036_TSM, 1 año después, otras causas 74.3% 25.7%
5710_TSM, 1 año después, TSM 72.1% 27.9%

Tiempo que demora esta sección: 0 minutos

Code
chisq.posthoc.test(table(base_tabla_cluster_benef_fonasa_a$prev_benef_rec_post_a, 
                         base_tabla_cluster_benef_fonasa_a$clus_pam)) %>% 
  dplyr::mutate_at(3:8, ~round(as.numeric(gsub("\\*","",.)),2)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-previsión (FONASA A)")
Comparación post-hoc, conglomerado-previsión (FONASA A)
Dimension Value 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
0 Residuals 1.32 -0.88 -1.35 -0.07 0.35 -0.31
0 p values 1.00 1.00 1.00 1.00 1.00 1.00
1 Residuals -1.32 0.88 1.35 0.07 -0.35 0.31
1 p values 1.00 1.00 1.00 1.00 1.00 1.00

Tiempo que demora esta sección: 0 minutos

2.1.3.h.b. ISAPRE vs. otros
Code
base_tabla_cluster_benef_isapre<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>%
  dplyr::mutate(prev_benef_rec_post_a = ifelse(prev_benef_rec_post== "ISAPRE",1,0))


base_tabla_cluster_benef_isapre %>% 
    janitor::tabyl(clus_pam, prev_benef_rec_post_a)%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }

    Pearson's Chi-squared test

data:  .
X-squared = 4.0391, df = 5, p-value = 0.5438


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.5529
alternative hypothesis: two.sided
Code
#X-squared = 4.0391, df = 5, p-value = 0.5438
#p-value = 0.5524


base_tabla_cluster_benef_isapre %>% 
  janitor::tabyl(clus_pam, prev_benef_rec_post_a)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate_at(2:3,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)", col.names= c("Conglomerado", "Resto", "ISAPRE"))
Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)
Conglomerado Resto ISAPRE
6035_Un evento, TSM 74.6% 25.4%
6025_Un evento, TUS 76.5% 23.5%
5939_Un evento TSM larga duración 76.2% 23.8%
5989_Un evento, comorbilidad 79.7% 20.3%
6036_TSM, 1 año después, otras causas 73.8% 26.2%
5710_TSM, 1 año después, TSM 76.0% 24.0%

Tiempo que demora esta sección: 0 minutos

Code
chisq.posthoc.test(table(base_tabla_cluster_benef_isapre$prev_benef_rec_post_a, 
                         base_tabla_cluster_benef_isapre$clus_pam)) %>% 
  dplyr::mutate_at(3:8, ~round(as.numeric(gsub("\\*","",.)),2)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-previsión (ISAPRE)")
Comparación post-hoc, conglomerado-previsión (ISAPRE)
Dimension Value 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
0 Residuals -1.43 0.88 0.46 1.56 -0.44 0.26
0 p values 1.00 1.00 1.00 1.00 1.00 1.00
1 Residuals 1.43 -0.88 -0.46 -1.56 0.44 -0.26
1 p values 1.00 1.00 1.00 1.00 1.00 1.00

Tiempo que demora esta sección: 0 minutos

2.1.3.i. Comparación covariables- Niv. Complejidad
Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(nivel_de_complejidad, clus_pam) %>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2) %>% 
   dplyr::mutate_at(2:7, ~scales::percent(as.numeric(.), accuracy=.1)) %>% 
  knitr::kable(caption="Tabla de contingencia, Niv. de complejidad (proporción por columna)")
Tabla de contingencia, Niv. de complejidad (proporción por columna)
nivel_de_complejidad 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
Alta Complejidad 61.0% 68.0% 49.0% 75.0% 66.0% 62.0%
Baja Complejidad 16.0% 19.0% 18.0% 9.0% 16.0% 7.0%
Mediana Complejidad 19.0% 11.0% 27.0% 15.0% 16.0% 24.0%
Pendiente 2.0% 1.0% 5.0% 1.0% 0.0% 6.0%
Sin dato 1.0% 1.0% 1.0% 0.0% 1.0% 1.0%

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(nivel_de_complejidad, clus_pam) %>% 
  janitor::fisher.test(simulate.p.value=T, B=1e5)
#p-value = 1e-05

tabla_cluster_complejidad<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                  by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first")

chisq.posthoc.test(
  table(tabla_cluster_complejidad$nivel_de_complejidad,tabla_cluster_complejidad$clus_pam)
) %>% 
  dplyr::mutate_at(3:8, ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-Niv. complejidad")

    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 1e-05
alternative hypothesis: two.sided
Comparación post-hoc, conglomerado-Niv. complejidad
Dimension Value 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
Alta Complejidad Residuals -2.132 3.412 -4.816 3.897 1.157 0.098
Alta Complejidad p values 0.990 0.019 0.000 0.003 1.000 1.000
Baja Complejidad Residuals 0.420 1.960 0.824 -2.795 0.048 -3.094
Baja Complejidad p values 1.000 1.000 1.000 0.156 1.000 0.059
Mediana Complejidad Residuals 2.247 -5.201 3.825 -1.438 -1.100 1.676
Mediana Complejidad p values 0.740 0.000 0.004 1.000 1.000 1.000
Pendiente Residuals 0.776 -2.892 2.937 -1.304 -1.742 2.969
Pendiente p values 1.000 0.115 0.099 1.000 1.000 0.090
Sin dato Residuals -1.355 1.044 1.182 -1.240 1.329 -0.094
Sin dato p values 1.000 1.000 1.000 1.000 1.000 1.000

Tiempo que demora esta sección: 0 minutos

2.1.3.j. Comparación covariables- Tratamientos
Code
#Definimos la base de datos que agrupa por observación y nos permite unirla con nuestros cluster
dias_ttos_base<-
data_long_establecimiento_2024_std %>% 
  dplyr::group_by(run) %>% 
  dplyr::mutate(diff_tr=fecha_ingreso_rec_fmt-lag(fecha_egreso_rec_fmt)) %>% 
  dplyr::ungroup() %>% 
  dplyr::group_by(run) %>% 
  dplyr::summarise(n_ttos=n(), promedio_dias=mean(days_elapsed), promedio_diff_tr=mean(diff_tr,na.rm=T))

table(as.numeric(dias_ttos_base$promedio_diff_tr)<0)
invisible("20 menores a 0")

dias_ttos_base$promedio_diff_tr<-ifelse(dias_ttos_base$promedio_diff_tr<0,-dias_ttos_base$promedio_diff_tr, dias_ttos_base$promedio_diff_tr)

invisible("Prueba de Levene par igualdad de varianzas")
with(dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, dias_ttos_base,  by = c("run" = "run"), multiple = "first"), car::leveneTest(n_ttos, clus_pam))

# Realizar el ANOVA comparando la edad media entre los diferentes conglomerados (clus_pam)
anova_n_ttos <-oneway.test(n_ttos ~ clus_pam, 
data = ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>%
                             dplyr::inner_join(dias_ttos_base, 
      by = c("run" = "run"), multiple = "first"), var.equal = F)
# Ver los resultados del ANOVA
print(anova_n_ttos)
#F = 101.98, num df = 5.00, denom df = 570.85, p-value < 2.2e-16

rstatix::games_howell_test(n_ttos ~ clus_pam, 
  data =ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>%
    dplyr::inner_join(dias_ttos_base, by = c("run" = "run"), multiple = "first")) %>% 
    dplyr::select(-1) %>% 
    dplyr::mutate(
    summary = sprintf(
      "%.2f [%.2f, %.2f], p= %s",
      as.numeric(estimate), 
      as.numeric(conf.low), 
      as.numeric(conf.high), 
      ifelse(p.adj < 0.001, "<0.001", sprintf("%.3f", p.adj)))) %>% 
  dplyr::select(!any_of(c("estimate","conf.low", "conf.high", "p.adj", "p.adj.signif"))) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado1","Conglomerado2", "Estimación"), caption="Post-hoc, conglomerado vs. N°s días de tratamiento")

FALSE  TRUE 
 2787    20 
Levene's Test for Homogeneity of Variance (center = median)
        Df F value    Pr(>F)    
group    5  95.597 < 2.2e-16 ***
      6032                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    One-way analysis of means (not assuming equal variances)

data:  n_ttos and clus_pam
F = 101.98, num df = 5.00, denom df = 570.85, p-value < 2.2e-16
Post-hoc, conglomerado vs. N°s días de tratamiento
Conglomerado1 Conglomerado2 Estimación
6035_Un evento, TSM 6025_Un evento, TUS 0.10 [-0.07, 0.27], p= 0.561
6035_Un evento, TSM 5939_Un evento TSM larga duración 2.11 [1.66, 2.56], p= <0.001
6035_Un evento, TSM 5989_Un evento, comorbilidad 0.56 [0.21, 0.91], p= <0.001
6035_Un evento, TSM 6036_TSM, 1 año después, otras causas 2.08 [1.66, 2.51], p= <0.001
6035_Un evento, TSM 5710_TSM, 1 año después, TSM 3.92 [2.91, 4.93], p= <0.001
6025_Un evento, TUS 5939_Un evento TSM larga duración 2.01 [1.54, 2.49], p= <0.001
6025_Un evento, TUS 5989_Un evento, comorbilidad 0.46 [0.08, 0.84], p= 0.009
6025_Un evento, TUS 6036_TSM, 1 año después, otras causas 1.98 [1.53, 2.44], p= <0.001
6025_Un evento, TUS 5710_TSM, 1 año después, TSM 3.82 [2.80, 4.84], p= <0.001
5939_Un evento TSM larga duración 5989_Un evento, comorbilidad -1.55 [-2.12, -0.99], p= <0.001
5939_Un evento TSM larga duración 6036_TSM, 1 año después, otras causas -0.03 [-0.64, 0.59], p= 1.000
5939_Un evento TSM larga duración 5710_TSM, 1 año después, TSM 1.81 [0.71, 2.91], p= <0.001
5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 1.52 [0.98, 2.07], p= <0.001
5989_Un evento, comorbilidad 5710_TSM, 1 año después, TSM 3.36 [2.30, 4.43], p= <0.001
6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM 1.84 [0.75, 2.93], p= <0.001

Tiempo que demora esta sección: 0.1 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(dias_ttos_base, 
                    by = c("run" = "run"), multiple = "first")  %>%
  dplyr::group_by(clus_pam) %>%
  dplyr::summarise(mean_n_ttos = mean(n_ttos),
                   sd= sd(n_ttos),
                   ci_lower = mean(n_ttos) - qt(0.975, n()-1) * sd(n_ttos)/sqrt(n()),
                   ci_upper = mean(n_ttos) + qt(0.975, n()-1) * sd(n_ttos)/sqrt(n())) %>% # Plot con ggplot2
  ggplot(aes(x = clus_pam, y = mean_n_ttos)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "N ttos promedio") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/n_ttos_por_cluster.png", dpi=600)
Número de tratamientos (promedio y bigotes en IC95%)

Número de tratamientos (promedio y bigotes en IC95%)

Tiempo que demora esta sección: 0.1 minutos

2.1.3.k. Comparación covariables- Días promedio
Code
rstatix::games_howell_test(promedio_dias ~ clus_pam, 
  data =ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>%
    dplyr::inner_join(dias_ttos_base, by = c("run" = "run"), multiple = "first")) %>% 
    dplyr::select(-1) %>% 
    dplyr::mutate(
    summary = sprintf(
      "%.2f [%.2f, %.2f], p= %s",
      as.numeric(estimate), 
      as.numeric(conf.low), 
      as.numeric(conf.high), 
      ifelse(p.adj < 0.001, "<0.001", sprintf("%.3f", p.adj)))) %>% 
  dplyr::select(!any_of(c("estimate","conf.low", "conf.high", "p.adj", "p.adj.signif"))) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado1","Conglomerado2", "Estimación"), caption="Post-hoc, conglomerado vs. Promedio días de tratamiento")
Post-hoc, conglomerado vs. Promedio días de tratamiento
Conglomerado1 Conglomerado2 Estimación
6035_Un evento, TSM 6025_Un evento, TUS -2.47 [-4.66, -0.27], p= 0.017
6035_Un evento, TSM 5939_Un evento TSM larga duración 16.94 [10.40, 23.48], p= <0.001
6035_Un evento, TSM 5989_Un evento, comorbilidad 14.52 [-1.66, 30.71], p= 0.107
6035_Un evento, TSM 6036_TSM, 1 año después, otras causas -3.51 [-5.24, -1.78], p= <0.001
6035_Un evento, TSM 5710_TSM, 1 año después, TSM 31.12 [8.89, 53.34], p= 0.001
6025_Un evento, TUS 5939_Un evento TSM larga duración 19.41 [12.57, 26.25], p= <0.001
6025_Un evento, TUS 5989_Un evento, comorbilidad 16.99 [0.68, 33.30], p= 0.036
6025_Un evento, TUS 6036_TSM, 1 año después, otras causas -1.04 [-3.71, 1.62], p= 0.873
6025_Un evento, TUS 5710_TSM, 1 año después, TSM 33.59 [11.27, 55.90], p= <0.001
5939_Un evento TSM larga duración 5989_Un evento, comorbilidad -2.42 [-19.82, 14.98], p= 0.999
5939_Un evento TSM larga duración 6036_TSM, 1 año después, otras causas -20.45 [-27.16, -13.75], p= <0.001
5939_Un evento TSM larga duración 5710_TSM, 1 año después, TSM 14.17 [-8.94, 37.29], p= 0.490
5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas -18.04 [-34.29, -1.78], p= 0.020
5989_Un evento, comorbilidad 5710_TSM, 1 año después, TSM 16.59 [-10.75, 43.94], p= 0.506
6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM 34.63 [12.35, 56.90], p= <0.001

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(dias_ttos_base, 
                    by = c("run" = "run"), multiple = "first")  %>%
  dplyr::group_by(clus_pam) %>%
  dplyr::summarise(mean_promedio_dias = mean(promedio_dias),
                   sd= sd(promedio_dias),
                   ci_lower = mean(promedio_dias) - qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n()),
                   ci_upper = mean(promedio_dias) + qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n())) %>% # Plot con ggplot2
  ggplot(aes(x = clus_pam, y = mean_promedio_dias)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "Días en tratamiento") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/dias_en_tto_por_cluster.png", dpi=600)
Días en tratamiento (promedio y bigotes en IC95%)

Días en tratamiento (promedio y bigotes en IC95%)

Tiempo que demora esta sección: 0.1 minutos

2.1.3.l. Comparación covariables- Días de diferencia
Code
rstatix::games_howell_test(promedio_diff_tr ~ clus_pam, 
  data =ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>%
    dplyr::inner_join(dias_ttos_base, by = c("run" = "run"), multiple = "first")) %>% 
    dplyr::select(-1) %>% 
    dplyr::mutate(
    summary = sprintf(
      "%.2f [%.2f, %.2f], p= %s",
      as.numeric(estimate), 
      as.numeric(conf.low), 
      as.numeric(conf.high), 
      ifelse(p.adj < 0.001, "<0.001", sprintf("%.3f", p.adj)))) %>% 
  dplyr::select(!any_of(c("estimate","conf.low", "conf.high", "p.adj", "p.adj.signif"))) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado1","Conglomerado2", "Estimación"), caption="Post-hoc, conglomerado vs. Promedio días de diferencia entre tratamientos")
Post-hoc, conglomerado vs. Promedio días de diferencia entre tratamientos
Conglomerado1 Conglomerado2 Estimación
6035_Un evento, TSM 6025_Un evento, TUS 0.90 [-64.61, 66.40], p= 1.000
6035_Un evento, TSM 5939_Un evento TSM larga duración -235.77 [-270.80, -200.75], p= <0.001
6035_Un evento, TSM 5989_Un evento, comorbilidad -93.48 [-193.11, 6.14], p= 0.079
6035_Un evento, TSM 6036_TSM, 1 año después, otras causas -111.75 [-146.29, -77.21], p= <0.001
6035_Un evento, TSM 5710_TSM, 1 año después, TSM -186.00 [-222.04, -149.96], p= <0.001
6025_Un evento, TUS 5939_Un evento TSM larga duración -236.67 [-302.72, -170.61], p= <0.001
6025_Un evento, TUS 5989_Un evento, comorbilidad -94.38 [-208.23, 19.47], p= 0.167
6025_Un evento, TUS 6036_TSM, 1 año después, otras causas -112.65 [-178.44, -46.85], p= <0.001
6025_Un evento, TUS 5710_TSM, 1 año después, TSM -186.90 [-253.46, -120.33], p= <0.001
5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 142.29 [42.31, 242.27], p= <0.001
5939_Un evento TSM larga duración 6036_TSM, 1 año después, otras causas 124.02 [88.40, 159.64], p= <0.001
5939_Un evento TSM larga duración 5710_TSM, 1 año después, TSM 49.77 [12.70, 86.84], p= 0.002
5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas -18.27 [-118.07, 81.54], p= 0.995
5989_Un evento, comorbilidad 5710_TSM, 1 año después, TSM -92.52 [-192.82, 7.78], p= 0.089
6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM -74.25 [-110.86, -37.64], p= <0.001

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
    dplyr::inner_join(dias_ttos_base, 
                      by = c("run" = "run"), multiple = "first")  %>%
    dplyr::group_by(clus_pam) %>%
    dplyr::summarise(mean_promedio_diff_tr = mean(promedio_diff_tr, na.rm=T),
                     sd= sd(promedio_diff_tr, na.rm=T),
                     ci_lower = mean(promedio_diff_tr, na.rm=T) - qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n()),
                     ci_upper = mean(promedio_diff_tr, na.rm=T) + qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n()),
                     n_ttos=scales::percent(sum(!is.na(promedio_diff_tr))/sum(n()))) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado1","Promedio días dif. entre ttos.", "DesvEst", "CI lo", "CI up", "% obs con tto pasado"), caption="Resumen, conglomerado vs. Promedio días de diferencia entre tratamientos")
Resumen, conglomerado vs. Promedio días de diferencia entre tratamientos
Conglomerado1 Promedio días dif. entre ttos. DesvEst CI lo CI up % obs con tto pasado
6035_Un evento, TSM 392.1975 355.2609 391.7920 392.6030 40%
6025_Un evento, TUS 393.0943 339.3405 391.6414 394.5473 38%
5939_Un evento TSM larga duración 156.4258 153.5565 151.9584 160.8933 93%
5989_Un evento, comorbilidad 298.7158 361.2905 287.6309 309.8008 57%
6036_TSM, 1 año después, otras causas 280.4466 123.3246 279.3294 281.5638 100%
5710_TSM, 1 año después, TSM 206.1955 115.5480 190.9884 221.4027 99%

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
    dplyr::inner_join(dias_ttos_base, 
                      by = c("run" = "run"), multiple = "first")  %>%
    dplyr::group_by(clus_pam) %>%
    dplyr::summarise(mean_promedio_diff_tr = mean(promedio_diff_tr, na.rm=T),
                     sd= sd(promedio_diff_tr, na.rm=T),
                     ci_lower = mean(promedio_diff_tr, na.rm=T) - qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n()),
                     ci_upper = mean(promedio_diff_tr, na.rm=T) + qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n()),
                     n_ttos=scales::percent(sum(!is.na(promedio_diff_tr))/sum(n()))) %>% 
  ggplot(aes(x = clus_pam, y = mean_promedio_diff_tr)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "Días entre tratamientos") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/dias_diff_entre_ttos_por_cluster.png", dpi=600)
Días de diferencia entre tratamientos (promedio y bigotes en IC95%)

Días de diferencia entre tratamientos (promedio y bigotes en IC95%)

Tiempo que demora esta sección: 0.1 minutos

2.1.4. Compilación comparación covariables

Code
# Definir los datos correctamente
data_pam6 <- data.frame(
  Grupo = c('1', '2', '3', '4', '5', '6'),
  Macrozona_Norte = c('+', '-', NA, NA, NA, NA),
  Macrozona_Sur = c('-', '+', NA, NA, NA, NA),
  RM = c(NA, '-', NA, '+', NA, NA),
  Sexo_Mujeres = c('+', '-', NA, '-', '+', NA),
  Edad = c(NA, '+', '-', NA, NA, NA),
  N_ttos = c('-', '-', NA, NA, NA, '+'),
  Dias_en_tto = c(NA, '-', NA, NA, NA, '+')
)

# Asegurar que los nombres de las columnas sean válidos y no haya espacios en blanco
colnames(data_pam6) <- c('Grupo', 'Macrozona\nNorte', 'Macrozona\nSur', 'RM', 'Sexo\n(Mujeres)', 'Edad', 'N°ttos', 'Dias_en\ntto.')

# Derretir el dataframe para que sea adecuado para ggplot2
data_melt_pam6 <- reshape2::melt(data_pam6, id.vars = 'Grupo', variable.name = 'Variable', value.name = 'Asociación')

# Reemplazar los NA por un valor vacío
data_melt_pam6$Asociación[is.na(data_melt_pam6$Asociación)] <- "\n"

# Crear el gráfico con ggplot
data_melt_pam6 %>% 
  dplyr::mutate(Variable = gsub("_", " ", Variable)) %>% 
ggplot(aes(x = Variable, y = Grupo, fill = Asociación)) +
  geom_tile(color = "white", size = 0.8) +
  scale_fill_manual(values = c("+" = "#556B2F", "-" = "#E2725B", "\n" = "white")) +
  labs(title =NULL, x = "Variables", y = "Conglomerado") +
  theme_minimal() +
  theme(#axis.text.x = element_text(angle = 45, hjust = 1),
        panel.grid = element_blank())+
  theme(
    axis.text.y = element_text(size = 17, face = "bold"),#,margin = margin(l = 7)),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 17, face = "bold"),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 16, face = "bold"),#,margin = margin(t = -15)),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 16, face = "bold"),          # Tamaño del título del eje Y
    plot.title = NULL,  # Tamaño y estilo del título del gráfico
    legend.title = element_text(size = 17, face = "bold"),          # Tamaño del título de la leyenda
    legend.spacing.y = unit(1.5, "lines"),
    legend.box.spacing = unit(0.5, "lines"),      # Controla el espacio entre la leyenda y el gráfico
    legend.margin = margin(5, 5, 5, 5),  
    legend.key.height = unit(1, "cm"),  
    legend.text = element_text(size = 15, face = "bold")            # Tamaño del texto de la leyenda
  ) +
  coord_flip()
ggsave("_figs/asociaciones.png", width=8.8*.8, height=5*.8, dpi=1000)
Comparación covariables con agrupamiento 6 conglomerados

Comparación covariables con agrupamiento 6 conglomerados

Tiempo que demora esta sección: 0.1 minutos

2.1.5. Regresión

Code
multinomial <- nnet::multinom(
  clus_pam ~ codigo_region_rec_base + glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin + prev_benef_rec_post,
  data = ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
    dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                      by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>%
    dplyr::mutate(prev_benef_rec_post = fct_relevel(prev_benef_rec_post, "FONASA A")),
  maxit = 1000,  # Aumenta el número de iteraciones
  trace = TRUE
)

model_table <- gtsummary::tbl_regression(multinomial, 
                              exponentiate = TRUE)
invisible("Usé la pertenencia a PPOO como binaria")
model_table
# weights:  60 (45 variable)
initial  value 10818.643675 
iter  10 value 5847.307596
iter  20 value 5574.080348
iter  30 value 5525.522191
iter  40 value 5524.336545
iter  50 value 5524.304683
final  value 5524.304601 
converged

Characteristic

OR

1

95% CI

1

p-value

6025_Un evento, TUS
codigo_region_rec_base


    noRM
    RM 0.61 0.50, 0.74 <0.001
glosa_sexo


    HOMBRE
    MUJER 0.27 0.22, 0.34 <0.001
factor_inclusivo_real_hist_mas_autperc_bin 1.09 0.84, 1.42 0.5
prev_benef_rec_post


    FONASA A
    FFAA 0.42 0.23, 0.75 0.004
    FONASA BC 0.94 0.76, 1.16 0.6
    FONASA D 1.26 0.96, 1.66 0.092
    ISAPRE 1.22 0.95, 1.57 0.12
glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin


    MUJER * factor_inclusivo_real_hist_mas_autperc_bin 1.27 0.84, 1.92 0.3
5939_Un evento TSM larga duración
codigo_region_rec_base


    noRM
    RM 1.25 0.96, 1.61 0.092
glosa_sexo


    HOMBRE
    MUJER 1.08 0.83, 1.39 0.6
factor_inclusivo_real_hist_mas_autperc_bin 0.83 0.50, 1.39 0.5
prev_benef_rec_post


    FONASA A
    FFAA 0.70 0.37, 1.31 0.3
    FONASA BC 0.84 0.63, 1.13 0.3
    FONASA D 0.80 0.54, 1.20 0.3
    ISAPRE 0.72 0.51, 1.01 0.056
glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin


    MUJER * factor_inclusivo_real_hist_mas_autperc_bin 1.07 0.57, 2.01 0.8
5989_Un evento, comorbilidad
codigo_region_rec_base


    noRM
    RM 1.95 1.44, 2.65 <0.001
glosa_sexo


    HOMBRE
    MUJER 0.40 0.29, 0.55 <0.001
factor_inclusivo_real_hist_mas_autperc_bin 1.32 0.85, 2.04 0.2
prev_benef_rec_post


    FONASA A
    FFAA 0.22 0.07, 0.72 0.012
    FONASA BC 1.20 0.84, 1.71 0.3
    FONASA D 1.01 0.62, 1.64 >0.9
    ISAPRE 0.60 0.39, 0.92 0.020
glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin


    MUJER * factor_inclusivo_real_hist_mas_autperc_bin 0.30 0.11, 0.77 0.012
6036_TSM, 1 año después, otras causas
codigo_region_rec_base


    noRM
    RM 1.28 0.93, 1.76 0.13
glosa_sexo


    HOMBRE
    MUJER 1.51 1.08, 2.10 0.016
factor_inclusivo_real_hist_mas_autperc_bin 0.95 0.48, 1.90 0.9
prev_benef_rec_post


    FONASA A
    FFAA 0.45 0.16, 1.27 0.13
    FONASA BC 1.18 0.82, 1.69 0.4
    FONASA D 0.73 0.42, 1.27 0.3
    ISAPRE 0.91 0.59, 1.40 0.7
glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin


    MUJER * factor_inclusivo_real_hist_mas_autperc_bin 1.13 0.51, 2.52 0.8
5710_TSM, 1 año después, TSM
codigo_region_rec_base


    noRM
    RM 1.37 0.95, 1.96 0.088
glosa_sexo


    HOMBRE
    MUJER 1.13 0.78, 1.64 0.5
factor_inclusivo_real_hist_mas_autperc_bin 1.15 0.59, 2.25 0.7
prev_benef_rec_post


    FONASA A
    FFAA 0.26 0.06, 1.07 0.061
    FONASA BC 1.09 0.73, 1.63 0.7
    FONASA D 0.74 0.41, 1.35 0.3
    ISAPRE 0.76 0.47, 1.23 0.3
glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin


    MUJER * factor_inclusivo_real_hist_mas_autperc_bin 0.92 0.40, 2.12 0.9
1

OR = Odds Ratio, CI = Confidence Interval

Tiempo que demora esta sección: 0.1 minutos


Información de la sesión

Code
message(paste0("R library: ", Sys.getenv("R_LIBS_USER")))

R library: C:/R/win-library/4.4

Code
message(paste0("Date: ",withr::with_locale(new = c('LC_TIME' = 'C'), code =Sys.time())))

Date: 2024-10-24 11:22:38.541494

Code
message(paste0("Editor context: ", getwd()))

Editor context: H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II

Tiempo que demora esta sección: 0 minutos

Code
sesion_info <- devtools::session_info()
dplyr::select(
  tibble::as_tibble(sesion_info$packages),
  c(package, loadedversion, source)
) %>% 
 knitr::kable(caption = "R packages", format = "html",
      col.names = c("Row number", "Package", "Version"),
    row.names = FALSE,
      align = c("c", "l", "r")) %>% 
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover"),font_size = 12) %>% 
  kableExtra::scroll_box(width = "100%", height = "375px")  
R packages
Row number Package Version
abind 1.4-5 CRAN (R 4.4.0)
backports 1.5.0 CRAN (R 4.4.0)
base64enc 0.1-3 CRAN (R 4.4.0)
boot 1.3-30 CRAN (R 4.4.0)
broom 1.0.6 CRAN (R 4.4.0)
broom.helpers 1.17.0 CRAN (R 4.4.1)
cachem 1.1.0 CRAN (R 4.4.0)
car 3.1-2 CRAN (R 4.4.1)
carData 3.0-5 CRAN (R 4.4.1)
cards 0.2.2 CRAN (R 4.4.1)
cellranger 1.1.0 CRAN (R 4.4.0)
chisq.posthoc.test 0.1.3 Github (ebbertd/chisq.posthoc.test@186d2ca6bbdba9fc19601aff4696ae1b85e7e0b0)
class 7.3-22 CRAN (R 4.4.0)
cli 3.6.3 CRAN (R 4.4.1)
cluster 2.1.6 CRAN (R 4.4.0)
coda 0.19-4.1 CRAN (R 4.4.1)
codetools 0.2-20 CRAN (R 4.4.0)
coin 1.4-3 CRAN (R 4.4.1)
colorspace 2.1-0 CRAN (R 4.4.0)
commonmark 1.9.1 CRAN (R 4.4.0)
crayon 1.5.2 CRAN (R 4.4.0)
curl 5.2.1 CRAN (R 4.4.0)
data.table 1.15.4 CRAN (R 4.4.0)
DescTools 0.99.57 CRAN (R 4.4.1)
devtools 2.4.5 CRAN (R 4.4.1)
digest 0.6.37 CRAN (R 4.4.0)
doFuture 1.0.1 CRAN (R 4.4.0)
doParallel 1.0.17 CRAN (R 4.4.0)
dplyr 1.1.4 CRAN (R 4.4.0)
e1071 1.7-14 CRAN (R 4.4.0)
ellipsis 0.3.2 CRAN (R 4.4.0)
emmeans 1.10.3 CRAN (R 4.4.1)
estimability 1.5.1 CRAN (R 4.4.1)
evaluate 0.24.0 CRAN (R 4.4.0)
Exact 3.3 CRAN (R 4.4.1)
expm 1.0-0 CRAN (R 4.4.1)
expsmooth 2.3 CRAN (R 4.4.1)
factoextra 1.0.7 CRAN (R 4.4.1)
fansi 1.0.6 CRAN (R 4.4.0)
farver 2.1.2 CRAN (R 4.4.0)
fastmap 1.2.0 CRAN (R 4.4.0)
fma 2.5 CRAN (R 4.4.1)
forcats 1.0.0 CRAN (R 4.4.0)
foreach 1.5.2 CRAN (R 4.4.0)
forecast 8.23.0 CRAN (R 4.4.1)
fpp2 2.5 CRAN (R 4.4.1)
fracdiff 1.5-3 CRAN (R 4.4.1)
fs 1.6.4 CRAN (R 4.4.0)
future 1.33.2 CRAN (R 4.4.0)
future.apply 1.11.2 CRAN (R 4.4.0)
generics 0.1.3 CRAN (R 4.4.0)
ggh4x 0.2.8 CRAN (R 4.4.1)
ggplot2 3.5.1 CRAN (R 4.4.0)
ggpubr 0.6.0 CRAN (R 4.4.1)
ggrepel 0.9.5 CRAN (R 4.4.1)
ggseqplot 0.8.4 CRAN (R 4.4.1)
ggsignif 0.6.4 CRAN (R 4.4.1)
gld 2.6.6 CRAN (R 4.4.1)
globals 0.16.3 CRAN (R 4.4.0)
glue 1.7.0 CRAN (R 4.4.0)
gridExtra 2.3 CRAN (R 4.4.0)
gt 0.11.0 CRAN (R 4.4.1)
gtable 0.3.5 CRAN (R 4.4.0)
gtsummary 2.0.2 CRAN (R 4.4.1)
haven 2.5.4 CRAN (R 4.4.0)
here 1.0.1 CRAN (R 4.4.1)
highr 0.11 CRAN (R 4.4.0)
hms 1.1.3 CRAN (R 4.4.0)
htmltools 0.5.8 CRAN (R 4.4.0)
htmlwidgets 1.6.4 CRAN (R 4.4.0)
httpuv 1.6.15 CRAN (R 4.4.0)
httr 1.4.7 CRAN (R 4.4.0)
iterators 1.0.14 CRAN (R 4.4.0)
janitor 2.2.0 CRAN (R 4.4.0)
job 0.3.1 CRAN (R 4.4.1)
jsonlite 1.8.8 CRAN (R 4.4.0)
kableExtra 1.4.0 CRAN (R 4.4.1)
knitr 1.47 CRAN (R 4.4.0)
labeling 0.4.3 CRAN (R 4.4.0)
labelled 2.13.0 CRAN (R 4.4.0)
later 1.3.2 CRAN (R 4.4.0)
lattice 0.22-6 CRAN (R 4.4.0)
libcoin 1.0-10 CRAN (R 4.4.0)
lifecycle 1.0.4 CRAN (R 4.4.0)
listenv 0.9.1 CRAN (R 4.4.0)
lmom 3.2 CRAN (R 4.4.1)
lmtest 0.9-40 CRAN (R 4.4.1)
lubridate 1.9.3 CRAN (R 4.4.0)
magrittr 2.0.3 CRAN (R 4.4.0)
markdown 1.13 CRAN (R 4.4.1)
MASS 7.3-60.2 local
Matrix 1.7-0 CRAN (R 4.4.0)
matrixStats 1.4.1 CRAN (R 4.4.1)
memoise 2.0.1 CRAN (R 4.4.0)
mgcv 1.9-1 CRAN (R 4.4.0)
mime 0.12 CRAN (R 4.4.0)
miniUI 0.1.1.1 CRAN (R 4.4.0)
mnormt 2.1.1 CRAN (R 4.4.0)
modeltools 0.2-23 CRAN (R 4.4.0)
multcomp 1.4-26 CRAN (R 4.4.0)
multcompView 0.1-10 CRAN (R 4.4.1)
munsell 0.5.1 CRAN (R 4.4.0)
mvtnorm 1.2-5 CRAN (R 4.4.0)
NbClust 3.0.1 CRAN (R 4.4.0)
nlme 3.1-164 CRAN (R 4.4.0)
nnet 7.3-19 CRAN (R 4.4.0)
nortest 1.0-4 CRAN (R 4.4.0)
pacman 0.5.1 CRAN (R 4.4.1)
parallelly 1.37.1 CRAN (R 4.4.0)
patchwork 1.2.0 CRAN (R 4.4.1)
permute 0.9-7 CRAN (R 4.4.0)
pillar 1.9.0 CRAN (R 4.4.0)
pkgbuild 1.4.4 CRAN (R 4.4.0)
pkgconfig 2.0.3 CRAN (R 4.4.0)
pkgload 1.3.4 CRAN (R 4.4.0)
plyr 1.8.9 CRAN (R 4.4.0)
png 0.1-8 CRAN (R 4.4.0)
profvis 0.3.8 CRAN (R 4.4.0)
progressr 0.14.0 CRAN (R 4.4.0)
promises 1.3.0 CRAN (R 4.4.0)
proxy 0.4-27 CRAN (R 4.4.0)
psych 2.4.3 CRAN (R 4.4.0)
purrr 1.0.2 CRAN (R 4.4.0)
quadprog 1.5-8 CRAN (R 4.4.0)
quantmod 0.4.26 CRAN (R 4.4.1)
R6 2.5.1 CRAN (R 4.4.0)
ragg 1.3.2 CRAN (R 4.4.0)
rbibutils 2.2.16 CRAN (R 4.4.1)
RColorBrewer 1.1-3 CRAN (R 4.4.0)
rcompanion 2.4.36 CRAN (R 4.4.1)
Rcpp 1.0.13 CRAN (R 4.4.1)
Rdpack 2.6 CRAN (R 4.4.1)
readr 2.1.5 CRAN (R 4.4.0)
readxl 1.4.3 CRAN (R 4.4.0)
remotes 2.5.0 CRAN (R 4.4.0)
reshape2 1.4.4 CRAN (R 4.4.0)
reticulate 1.38.0 CRAN (R 4.4.1)
rlang 1.1.4 CRAN (R 4.4.0)
rmarkdown 2.28 CRAN (R 4.4.1)
rootSolve 1.8.2.4 CRAN (R 4.4.0)
rprojroot 2.0.4 CRAN (R 4.4.0)
rstatix 0.7.2 CRAN (R 4.4.1)
rstudioapi 0.17.0 CRAN (R 4.4.1)
sandwich 3.1-0 CRAN (R 4.4.1)
sass 0.4.9 CRAN (R 4.4.0)
scales 1.3.0 CRAN (R 4.4.0)
sessioninfo 1.2.2 CRAN (R 4.4.0)
shiny 1.8.1.1 CRAN (R 4.4.0)
snakecase 0.11.1 CRAN (R 4.4.0)
stargazer 5.2.3 CRAN (R 4.4.0)
stringi 1.8.4 CRAN (R 4.4.0)
stringr 1.5.1 CRAN (R 4.4.0)
survival 3.5-8 CRAN (R 4.4.0)
svglite 2.1.3 CRAN (R 4.4.1)
systemfonts 1.1.0 CRAN (R 4.4.0)
textshaping 0.4.0 CRAN (R 4.4.0)
TH.data 1.1-2 CRAN (R 4.4.1)
tibble 3.2.1 CRAN (R 4.4.0)
tidyr 1.3.1 CRAN (R 4.4.0)
tidyselect 1.2.1 CRAN (R 4.4.0)
tidyverse 2.0.0 CRAN (R 4.4.0)
timechange 0.3.0 CRAN (R 4.4.0)
timeDate 4032.109 CRAN (R 4.4.0)
Tmisc 1.0.1 CRAN (R 4.4.1)
TraMineR 2.2-10 CRAN (R 4.4.0)
TraMineRextras 0.6.7 CRAN (R 4.4.0)
tseries 0.10-58 CRAN (R 4.4.1)
TTR 0.24.4 CRAN (R 4.4.1)
tzdb 0.4.0 CRAN (R 4.4.0)
urca 1.3-4 CRAN (R 4.4.1)
urlchecker 1.0.1 CRAN (R 4.4.0)
usethis 2.2.3 CRAN (R 4.4.0)
utf8 1.2.4 CRAN (R 4.4.0)
vctrs 0.6.5 CRAN (R 4.4.0)
vegan 2.6-6.1 CRAN (R 4.4.0)
viridisLite 0.4.2 CRAN (R 4.4.0)
WeightedCluster 1.6-4 CRAN (R 4.4.0)
withr 3.0.0 CRAN (R 4.4.0)
xfun 0.44 CRAN (R 4.4.0)
xml2 1.3.6 CRAN (R 4.4.0)
xtable 1.8-4 CRAN (R 4.4.0)
xts 0.14.0 CRAN (R 4.4.1)
yaml 2.3.8 CRAN (R 4.4.0)
zoo 1.8-12 CRAN (R 4.4.0)

Tiempo que demora esta sección: 0 minutos

Code
reticulate::py_list_packages()%>% 
 knitr::kable(caption = "Python packages", format = "html",
      col.names = c("Package", "Version", "Requirement"),
    row.names = FALSE,
      align = c("c", "l", "r", "r"))%>% 
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover"),font_size = 12) %>% 
  kableExtra::scroll_box(width = "100%", height = "375px")  
Python packages
Package Version Requirement
absl-py 2.1.0 absl-py==2.1.0
asttokens 2.4.1 asttokens==2.4.1
astunparse 1.6.3 astunparse==1.6.3
audioconverter 2.0.3 audioconverter==2.0.3
autograd 1.6.2 autograd==1.6.2
autograd-gamma 0.5.0 autograd-gamma==0.5.0
beautifulsoup4 4.12.3 beautifulsoup4==4.12.3
Brotli 1.1.0 Brotli==1.1.0
certifi 2023.11.17 certifi==2023.11.17
cffi 1.16.0 cffi==1.16.0
charset-normalizer 3.3.2 charset-normalizer==3.3.2
clarabel 0.9.0 clarabel==0.9.0
click 8.1.7 click==8.1.7
cloudpickle 3.0.0 cloudpickle==3.0.0
colorama 0.4.6 colorama==0.4.6
comm 0.2.1 comm==0.2.1
contourpy 1.2.0 contourpy==1.2.0
cvxopt 1.3.2 cvxopt==1.3.2
cvxpy 1.5.2 cvxpy==1.5.2
cycler 0.12.1 cycler==0.12.1
debugpy 1.8.0 debugpy==1.8.0
decorator 4.4.2 decorator==4.4.2
delete-chrome-history-py 0.1.8 delete-chrome-history-py==0.1.8
easyocr 1.7.1 easyocr==1.7.1
ecos 2.0.13 ecos==2.0.13
editdistance 0.8.1 editdistance==0.8.1
efficientnet 1.0.0 efficientnet==1.0.0
essential-generators 1.0 essential-generators==1.0
et-xmlfile 1.1.0 et-xmlfile==1.1.0
executing 2.0.1 executing==2.0.1
fancyimpute 0.7.0 fancyimpute==0.7.0
ffmpeg 1.4 ffmpeg==1.4
ffmpeg-python 0.2.0 ffmpeg-python==0.2.0
filedir 0.0.3 filedir==0.0.3
filelock 3.13.1 filelock==3.13.1
flatbuffers 24.3.25 flatbuffers==24.3.25
fonttools 4.47.2 fonttools==4.47.2
formulaic 1.0.1 formulaic==1.0.1
fsspec 2023.12.2 fsspec==2023.12.2
future 0.18.3 future==0.18.3
gast 0.6.0 gast==0.6.0
git-filter-repo 2.45.0 git-filter-repo==2.45.0
google-pasta 0.2.0 google-pasta==0.2.0
graphviz 0.20.3 graphviz==0.20.3
grpcio 1.65.4 grpcio==1.65.4
gTTS 2.5.1 gTTS==2.5.1
h5py 3.11.0 h5py==3.11.0
idna 3.6 idna==3.6
imageio 2.34.2 imageio==2.34.2
imageio-ffmpeg 0.5.1 imageio-ffmpeg==0.5.1
imgaug 0.4.0 imgaug==0.4.0
iniconfig 2.0.0 iniconfig==2.0.0
interface-meta 1.3.0 interface-meta==1.3.0
ipykernel 6.29.0 ipykernel==6.29.0
ipython 8.20.0 ipython==8.20.0
jedi 0.19.1 jedi==0.19.1
Jinja2 3.1.3 Jinja2==3.1.3
joblib 1.4.0 joblib==1.4.0
jupyter_client 8.6.0 jupyter_client==8.6.0
jupyter_core 5.7.1 jupyter_core==5.7.1
keras 3.4.1 keras==3.4.1
Keras-Applications 1.0.8 Keras-Applications==1.0.8
keras-ocr 0.9.3 keras-ocr==0.9.3
kiwisolver 1.4.5 kiwisolver==1.4.5
knnimpute 0.1.0 knnimpute==0.1.0
lazy_loader 0.4 lazy_loader==0.4
libclang 18.1.1 libclang==18.1.1
lifelines 0.28.0 lifelines==0.28.0
llvmlite 0.41.1 llvmlite==0.41.1
Markdown 3.6 Markdown==3.6
markdown-it-py 3.0.0 markdown-it-py==3.0.0
MarkupSafe 2.1.4 MarkupSafe==2.1.4
matplotlib 3.8.2 matplotlib==3.8.2
matplotlib-inline 0.1.6 matplotlib-inline==0.1.6
mdurl 0.1.2 mdurl==0.1.2
ml-dtypes 0.4.0 ml-dtypes==0.4.0
more-itertools 10.2.0 more-itertools==10.2.0
moviepy 1.0.3 moviepy==1.0.3
mpmath 1.3.0 mpmath==1.3.0
multipledispatch 1.0.0 multipledispatch==1.0.0
mutagen 1.47.0 mutagen==1.47.0
namex 0.0.8 namex==0.0.8
natsort 8.4.0 natsort==8.4.0
nest-asyncio 1.5.9 nest-asyncio==1.5.9
networkx 3.2.1 networkx==3.2.1
ninja 1.11.1.1 ninja==1.11.1.1
nose 1.3.7 nose==1.3.7
numba 0.58.1 numba==0.58.1
numexpr 2.10.0 numexpr==2.10.0
numpy 1.26.3 numpy==1.26.3
openai-whisper 20231117 openai-whisper==20231117
opencv-python 4.10.0.84 opencv-python==4.10.0.84
opencv-python-headless 4.10.0.84 opencv-python-headless==4.10.0.84
openpyxl 3.1.4 openpyxl==3.1.4
opt-einsum 3.3.0 opt-einsum==3.3.0
optree 0.12.1 optree==0.12.1
osqp 0.6.5 osqp==0.6.5
packaging 23.2 packaging==23.2
pandas 2.2.0 pandas==2.2.0
pandas-flavor 0.6.0 pandas-flavor==0.6.0
parso 0.8.3 parso==0.8.3
patsy 0.5.6 patsy==0.5.6
pillow 10.2.0 pillow==10.2.0
platformdirs 4.1.0 platformdirs==4.1.0
pluggy 1.5.0 pluggy==1.5.0
polars 1.9.0 polars==1.9.0
proglog 0.1.10 proglog==0.1.10
prompt-toolkit 3.0.43 prompt-toolkit==3.0.43
protobuf 4.25.4 protobuf==4.25.4
psutil 5.9.8 psutil==5.9.8
pure-eval 0.2.2 pure-eval==0.2.2
pyarrow 15.0.0 pyarrow==15.0.0
pyclipper 1.3.0.post5 pyclipper==1.3.0.post5
pycparser 2.22 pycparser==2.22
pycryptodomex 3.20.0 pycryptodomex==3.20.0
pydotplus 2.0.2 pydotplus==2.0.2
pydub 0.24.1 pydub==0.24.1
Pygments 2.17.2 Pygments==2.17.2
pyjanitor 0.26.0 pyjanitor==0.26.0
PyMuPDF 1.24.9 PyMuPDF==1.24.9
PyMuPDFb 1.24.9 PyMuPDFb==1.24.9
pyparsing 3.1.1 pyparsing==3.1.1
pyreadr 0.5.0 pyreadr==0.5.0
pytesseract 0.3.10 pytesseract==0.3.10
pytest 8.3.1 pytest==8.3.1
python-bidi 0.6.0 python-bidi==0.6.0
python-dateutil 2.8.2 python-dateutil==2.8.2
pytube 15.0.0 pytube==15.0.0
pytube3 9.6.4 pytube3==9.6.4
pytz 2023.3.post1 pytz==2023.3.post1
pywin32 306 pywin32==306
PyYAML 6.0.1 PyYAML==6.0.1
pyzmq 25.1.2 pyzmq==25.1.2
qdldl 0.1.7.post1 qdldl==0.1.7.post1
regex 2023.12.25 regex==2023.12.25
requests 2.32.3 requests==2.32.3
rich 13.7.1 rich==13.7.1
rpy2 3.5.16 rpy2==3.5.16
scikit-image 0.24.0 scikit-image==0.24.0
scikit-learn 1.3.2 scikit-learn==1.3.2
scikit-survival 0.22.2 scikit-survival==0.22.2
scipy 1.11.4 scipy==1.11.4
scs 3.2.6 scs==3.2.6
seaborn 0.13.2 seaborn==0.13.2
semantic-version 2.10.0 semantic-version==2.10.0
setuptools-rust 1.8.1 setuptools-rust==1.8.1
shapely 2.0.5 shapely==2.0.5
six 1.16.0 six==1.16.0
soupsieve 2.5 soupsieve==2.5
SpeechRecognition 3.10.1 SpeechRecognition==3.10.1
spyder-kernels 2.5.0 spyder-kernels==2.5.0
stack-data 0.6.3 stack-data==0.6.3
statsmodels 0.14.1 statsmodels==0.14.1
sympy 1.12 sympy==1.12
target 0.0.11 target==0.0.11
tensorboard 2.17.0 tensorboard==2.17.0
tensorboard-data-server 0.7.2 tensorboard-data-server==0.7.2
tensorflow 2.17.0 tensorflow==2.17.0
tensorflow-intel 2.17.0 tensorflow-intel==2.17.0
tensorflow-io-gcs-filesystem 0.31.0 tensorflow-io-gcs-filesystem==0.31.0
termcolor 2.4.0 termcolor==2.4.0
threadpoolctl 3.4.0 threadpoolctl==3.4.0
tifffile 2024.7.24 tifffile==2024.7.24
tiktoken 0.5.2 tiktoken==0.5.2
torch 2.4.0 torch==2.4.0
torchaudio 2.4.0 torchaudio==2.4.0
torchvision 0.19.0 torchvision==0.19.0
tornado 6.4 tornado==6.4
tqdm 4.66.1 tqdm==4.66.1
traitlets 5.14.1 traitlets==5.14.1
translator 0.0.9 translator==0.0.9
typing_extensions 4.9.0 typing_extensions==4.9.0
tzdata 2023.4 tzdata==2023.4
tzlocal 5.2 tzlocal==5.2
urllib3 2.1.0 urllib3==2.1.0
validators 0.33.0 validators==0.33.0
watchdog 3.0.0 watchdog==3.0.0
wcwidth 0.2.13 wcwidth==0.2.13
websockets 12.0 websockets==12.0
Werkzeug 3.0.3 Werkzeug==3.0.3
whisper 1.1.10 whisper==1.1.10
wrapt 1.16.0 wrapt==1.16.0
xarray 2024.1.1 xarray==2024.1.1
youtube-dl 2021.12.17 youtube-dl==2021.12.17
yt-dlp 2024.7.9 yt-dlp==2024.7.9

Tiempo que demora esta sección: 0 minutos